我可以确保两列的值不相同吗


11

如果我有一个像这样的桌子

CREATE TABLE foo (
   id INT NOT NULL AUTO_INCREMENT,
   aa INT NOT NULL,
   bb INT NOT NULL,
   PRIMARY KEY (id),
   UNIQUE KEY (aa, bb),
   CONSTRAINT aa_ref FOREIGN KEY (aa) REFERENCES bar (id),
   CONSTRAINT bb_ref FOREIGN KEY (bb) REFERENCES bar (id)
)

aa != bb除了使用应用程序级逻辑或强制触发器在插入前失败之外,是否有其他方法可以确保?

Answers:


3

MySQL不CHECK直接支持contrsaints,尽管如果您的版本足够新,则它支持通过触发和错误引发SIGNAL,因此您可以定义BEFORE INSERTBEFORE UPDATE触发检查数据并在不满足预期约束的情况下引发错误。

当然,这将比对检查约束的本机支持效率低,因此,如果您要对该结构执行大量写入操作,请确保分析由触发器引起的性能差异,以防对应用程序造成太大损害。


8

不,你不能。在大多数DBMS(Postgres,SQL-Server,Oracle,DB2和许多其他数据库)中,您只需添加一个CHECK约束即可:

ALTER TABLE foo 
  ADD CONSTRAINT aa_cannot_be_equal_to_bb_CHK
    CHECK (aa <> bb) ;

我没有看到任何在MySQL中使用引用约束的方法。除了触发器之外,您还可以允许两列具有相等的值,并通过始终通过视图访问表来忽略行:

CREATE VIEW foo_correct AS
SELECT id, aa, bb
FROM foo
WHERE aa <> bb ;

另外,您可以通过(存储的)过程来限制插入和更新操作,这些过程要处理约束,并且不允许插入(或更改)不满足约束的数据。



-1

有问题的两列都引用相同的Bar表。您能否将Bar表拆分为两个,以便它们包含具有不同值集的id?


1
然后,说我们Foo桌上有三对夫妇:(1,2) (2,3) (3,1)。我们应该如何划分三个值?
ypercubeᵀᴹ

1
我同意,错误的建议。
msi77
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.