我在一个应用程序中有一个表,它的当前架构是:
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中是可能的吗?强制执行外键、主键以外的列的唯一性等约束很好,我可以找到有关对多个列应用唯一约束的信息,但我找不到涉及多个列的更复杂约束的任何内容。
发布于 2012-07-23 16:11:59
由a_horse_with_no_name回答,但在注释中,因此无法接受:
“如果不在MySQL中恢复为触发器,我认为这是不可能的,因为MySQL不支持部分索引。”
发布于 2012-07-23 16:22:13
如果要在不使用触发器的情况下执行此操作,可以添加另一个表,其中只存储接受的报价-并且可以从quotes表中删除accepted列:
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;发布于 2012-07-13 16:42:05
你的意思是你想要这样的UNIQUE:
UNIQUE `quote_accepts` (`quote_request_id`, `accepted`)其中,对于重复的quote_request_id和accepted对,INSERT将失败。
https://stackoverflow.com/questions/11466964
复制相似问题