2 个外键具有相同辅助列值的约束

Eri*_*son 2 mysql database-design constraint

假设我有一个像 Users 这样的表,它有一个 id 和一个 company_id,我想创建一个第二个表,其中有一对用户 id 的 ex: (primary_key_id, user1_id, user2_id)。

这些用户对的用户 ID 必须位于同一公司。

如何向我的数据库添加约束以实现此要求?

Cha*_*ace 6

company_id您可以创建跨id表的唯一约束User,然后创建两个引用它们的外键。

MySQL 语法

CREATE TABLE `User` (
  id int PRIMARY KEY,
  company_id int,
  UNIQUE KEY (company_id, id)
);

CREATE TABLE UserPair (
  company_id int,
  user1_id int,
  user2_id int,
  PRIMARY KEY (company_id, user1_id, user2_id),
  FOREIGN KEY (company_id, user1_id) REFERENCES `User` (company_id, id),
  FOREIGN KEY (company_id, user2_id) REFERENCES `User` (company_id, id)
);
Run Code Online (Sandbox Code Playgroud)
INSERT `User` (id, company_id) VALUES
(1,1),
(2,1),
(3,2);
Run Code Online (Sandbox Code Playgroud)
INSERT UserPair (company_id, user1_id, user2_id) VALUES(1,1,2);
Run Code Online (Sandbox Code Playgroud)
INSERT UserPair (company_id, user1_id, user2_id) VALUES(1,1,3);
-- Cannot add or update a child row: a foreign key constraint fails
Run Code Online (Sandbox Code Playgroud)

db<>fiddle(对于 SQL Server,语法略有不同)

该约束失败,因为每个外键仅使用一个company_id,但相应的父行之一具有不同的company_id.