Mysql

約束 2 個外鍵具有相同的輔助列值

  • June 19, 2022

假設我有一個表,例如使用者,它有一個 id 和一個 company_id,我想創建一個第二個表,其中包含一對使用者 id 的 ex:(primary_key_id,user1_id,user2_id)。

這些使用者對的使用者 ID 必須在同一家公司。

如何向我的數據庫添加一個約束來要求這個?

您可以在表中創建唯一約束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)
);
INSERT `User` (id, company_id) VALUES
(1,1),
(2,1),
(3,2);
INSERT UserPair (company_id, user1_id, user2_id) VALUES(1,1,2);
INSERT UserPair (company_id, user1_id, user2_id) VALUES(1,1,3);
-- Cannot add or update a child row: a foreign key constraint fails

db<>fiddle(對於 SQL Server,語法略有不同)

約束失敗,因為company_id每個外鍵只使用一個,但對應的父行之一具有不同的company_id.

引用自:https://dba.stackexchange.com/questions/313520