我在应用程序中有一个表,当前架构是:
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查询尝试修改表,使得两个或多个行具有相同的{{1值的quote_request_id
值为1。
这在MySQL中可行吗?执行诸如外键之类的约束,除主键之外的列的唯一性等工作正常,我可以找到有关将UNIQUE约束应用于多列的信息,但我找不到任何涉及涉及多列的更复杂约束的信息。
答案 0 :(得分:1)
如果您想在没有触发器的情况下执行此操作,则可以添加另一个仅存储已接受引号的表格 - 您可以从accepted
表中删除quotes
列:
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 :(得分:0)
你的意思是你想要UNIQUE
这样:
UNIQUE `quote_accepts` (`quote_request_id`, `accepted`)
其中,重复一对quote_request_id
& accepted
,INSERT
将失败。
答案 2 :(得分:0)
由a_horse_with_no_name回答,但在评论中因此无法接受:
“我认为如果没有恢复到MySQL的触发器,这是可能的,因为MySQL不支持部分索引。”