我在当前模式为的应用程序中有一个表:
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;
我想强制执行一个约束,这样给定的报价请求只能接受一个报价 - 即,如果更新或插入查询试图修改表,使得两行或多行具有相同的 ,则更新或插入查询应该失败quote_request_id
值的 accepted
值为 1。
这在 MySQL 中可行吗?强制执行约束(例如外键、除主键以外的列的唯一性等)工作正常,我可以找到有关将 UNIQUE 约束应用于多列的信息,但我找不到有关涉及多列的更复杂约束的任何信息。
最佳答案
如果你想在没有触发器的情况下执行此操作,你可以添加另一个表,其中只存储接受的报价 - 你可以从 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;
关于涉及多列的 MySQL 约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11466964/