首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我能确保两列没有相同的值吗?

问我能确保两列没有相同的值吗?
EN

Database Administration用户
提问于 2013-04-13 07:09:59
回答 4查看 23.9K关注 0票数 14

如果我有张像这样的桌子

代码语言:javascript
复制
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?

EN

回答 4

Database Administration用户

回答已采纳

发布于 2013-04-13 10:52:45

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

当然,这比本机对check约束的支持效率要低,因此,如果要对该结构执行大量的写操作,一定要分析触发器造成的性能差异,以防它对您的应用程序造成太大的损害。

票数 4
EN

Database Administration用户

发布于 2013-04-13 08:29:10

不,您不能。在大多数DBMS (Postgres、Server、Oracle、DB2等)中,您只需添加一个CHECK约束:

代码语言:javascript
复制
ALTER TABLE foo 
  ADD CONSTRAINT aa_cannot_be_equal_to_bb_CHK
    CHECK (aa <> bb) ;

我看不出在MySQL中有任何方法,只使用引用约束。除了触发器之外,还可以允许这两列具有相同的值,只需通过一个视图访问该表,从而忽略这些行:

代码语言:javascript
复制
CREATE VIEW foo_correct AS
SELECT id, aa, bb
FROM foo
WHERE aa <> bb ;

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

票数 11
EN

Database Administration用户

发布于 2019-12-22 01:55:56

票数 4
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/39885

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档