涉及多列的 MySQL 约束

标签 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;

我想强制执行一个约束,这样给定的报价请求只能接受一个报价 - 即,如果更新或插入查询试图修改表,使得两行或多行具有相同的 ,则更新或插入查询应该失败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/

相关文章:

algorithm - 在列表序言中创建数字组合

mysql - 如何用2个表指定约束

sql - 在 Oracle 中创建唯一/主键约束所需的权限是什么?

ios - 来自 xib 的 View 存在奇怪的约束/UI 错误

php - 在 mysql row php 中使用 urlencode

javascript - 模块名称 "mysql"尚未加载上下文 : _. 使用 require([]) http ://requirejs. org/docs/errors.html#notloaded

mysql - 为 mac os 安装哪个 jdbc (connector/j)

mysql - 查询以选择帖子并标记当前用户是否喜欢其中的一些帖子

mysql - 更新表,以便多个用户获得新行

ios - 根据 subview 大小调整 XIB 中 UIView 的大小