如果我有张像这样的桌子
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?
发布于 2013-04-13 10:52:45
MySQL不直接支持CHECK控件,尽管如果您有足够的最新版本,它支持通过SIGNAL触发和引发错误,因此您可以定义检查数据的BEFORE INSERT和BEFORE UPDATE触发器,并在不满足预期约束的情况下引发错误。
当然,这比本机对check约束的支持效率要低,因此,如果要对该结构执行大量的写操作,一定要分析触发器造成的性能差异,以防它对您的应用程序造成太大的损害。
发布于 2013-04-13 08:29:10
不,您不能。在大多数DBMS (Postgres、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 ;或者,可以通过(存储)过程限制Insert和Update操作,这些过程处理约束,并且不允许插入(或更改)不满足约束的数据。
发布于 2019-12-22 01:55:56
https://dba.stackexchange.com/questions/39885
复制相似问题