如果我有一张看起来像这样的桌子
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
除了使用应用程序级逻辑或强制触发器在插入前失败?
不,你不能。在大多数 DBMS(Postgres、SQL-Server、Oracle、DB2 等)中,您只需添加一个
CHECK
约束:我没有看到任何方法在 MySQL 中使用它,只使用引用约束。除了触发器之外,您还可以允许两列具有相等的值,并通过始终通过视图访问表来简单地忽略行:
或者,您可以通过处理约束的(存储)过程来限制插入和更新操作,并且不允许插入(或更改)不满足约束的数据。
MySQL 不
CHECK
直接支持 contrsaints,但如果您有足够新的版本,它支持触发器和通过 引发错误SIGNAL
,因此您可以定义BEFORE INSERT
和BEFORE UPDATE
触发器来检查数据并在不满足预期约束时引发错误。当然,这将比对检查约束的本机支持效率低,因此如果您对该结构执行大量写入,请务必分析由触发器引起的性能差异,以防它对您的应用程序造成太大伤害。
好消息!!
Mysql 支持 CHECK CONSTRAINT
https://dev.mysql.com/doc/refman/8.0/en/create-table-check-constraints.html
有问题的两列都引用同一个 Bar 表。您能否将 Bar 表拆分为两个,以便它们包含具有不同值集的 id?