首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >涉及多列的MySQL约束

问涉及多列的MySQL约束
EN

Stack Overflow用户
提问于 2012-07-13 16:39:10
回答 3查看 316关注 0票数 2

我在一个应用程序中有一个表,它的当前架构是:

代码语言:javascript
复制
CREATE TABLE quotes
(
  id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
  quote_request_id INT UNSIGNED NOT NULL,
  quote_amount DECIMAL(12, 2) NOT NULL,
  accepted TINYINT UNSIGNED NOT NULL DEFAULT 0,
  FOREIGN KEY (quote_request_id) REFERENCES quote_requests(id)
) Engine=InnoDB;

我想实施一个约束,使给定的报价请求只能接受一个引号-即,如果UPDATE或INSERT查询试图修改表,使具有相同quote_request_id值的两行或更多行的accepted值为1,则该查询将失败。

这在MySQL中是可能的吗?强制执行外键、主键以外的列的唯一性等约束很好,我可以找到有关对多个列应用唯一约束的信息,但我找不到涉及多个列的更复杂约束的任何内容。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-07-23 16:11:59

由a_horse_with_no_name回答,但在注释中,因此无法接受:

“如果不在MySQL中恢复为触发器,我认为这是不可能的,因为MySQL不支持部分索引。”

票数 0
EN

Stack Overflow用户

发布于 2012-07-23 16:22:13

如果要在不使用触发器的情况下执行此操作,可以添加另一个表,其中只存储接受的报价-并且可以从quotes表中删除accepted列:

代码语言:javascript
复制
CREATE TABLE quotes
(
  id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
  quote_request_id INT UNSIGNED NOT NULL,
  quote_amount DECIMAL(12, 2) NOT NULL,
  --- accepted TINYINT UNSIGNED NOT NULL DEFAULT 0,             --- removed
  FOREIGN KEY (quote_request_id) REFERENCES quote_requests(id)
  UNIQUE KEY (quote_request_id, id)               --- needed for the FK below
) Engine=InnoDB;

CREATE TABLE quotes_accepted
(
  id INT UNSIGNED NOT NULL PRIMARY KEY,
  quote_request_id INT UNSIGNED NOT NULL,
  UNIQUE KEY (quote_request_id),            --- this ensures there is only one
                                            --- accepted quote per request
  FOREIGN KEY (quote_request_id, id) 
    REFERENCES quotes(quote_request_id, id)
) Engine=InnoDB;
票数 1
EN

Stack Overflow用户

发布于 2012-07-13 16:42:05

你的意思是你想要这样的UNIQUE:

代码语言:javascript
复制
UNIQUE `quote_accepts` (`quote_request_id`, `accepted`)

其中,对于重复的quote_request_id和accepted对,INSERT将失败。

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

https://stackoverflow.com/questions/11466964

复制
相关文章

相似问题

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