MySQL约束涉及多个列

时间:2012-07-13 08:39:10

标签: mysql constraints

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

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约束应用于多列的信息,但我找不到任何涉及涉及多列的更复杂约束的信息。

3 个答案:

答案 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& acceptedINSERT将失败。

答案 2 :(得分:0)

由a_horse_with_no_name回答,但在评论中因此无法接受:

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