如果我有一张看起来像这样的桌子
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)
)
Run Code Online (Sandbox Code Playgroud)
aa != bb除了使用应用程序级逻辑或强制触发器在 BEFORE INSERT 上失败之外,有没有办法确保?
ype*_*eᵀᴹ 10
不,你不能。在大多数 DBMS(Postgres、SQL-Server、Oracle、DB2 等)中,您只需添加一个CHECK约束:
ALTER TABLE foo
ADD CONSTRAINT aa_cannot_be_equal_to_bb_CHK
CHECK (aa <> bb) ;
Run Code Online (Sandbox Code Playgroud)
我在 MySQL 中看不到任何方法,只使用引用约束。除了触发器之外,您还可以允许两列具有相等的值,并通过始终通过视图访问表来简单地忽略行:
CREATE VIEW foo_correct AS
SELECT id, aa, bb
FROM foo
WHERE aa <> bb ;
Run Code Online (Sandbox Code Playgroud)
或者,您可以通过处理约束的(存储)过程来限制插入和更新操作,并且不允许插入(或更改)不满足约束的数据。
MySQL 不CHECK直接支持约束,但如果您有足够新的版本,它支持触发器和通过 引发错误SIGNAL,因此您可以定义BEFORE INSERT触发器BEFORE UPDATE来检查数据并在不满足预期约束时引发错误。
当然,这比对检查约束的本机支持效率低,因此,如果您对该结构执行大量写入,请务必分析触发器引起的性能差异,以防它对您的应用程序造成太大损害。
| 归档时间: |
|
| 查看次数: |
19985 次 |
| 最近记录: |