问题描述
假设我有 Partner
和 Partner
表。我想要一个 User
的复合键,它是一对 Partner
。所以我可以有键 (A,B) 和 (B,A),其中 A 和 B 都是用户。我想让 (A,A) 引用同一个 CREATE TABLE User
(
ID int,....
)
PRIMARY KEY (ID);
CREATE TABLE Partner
(
User1 UserID,User2 UserID
...
)
PRIMARY KEY (User1,User2)
实体。这似乎是一个常见问题,但我找不到答案。
好的,更具体地说,
.caixa_botoes{
width: 60%;
margin-left: 20%;
}
我想要的是 (User1,User2) 和 (User2,User1) 代表相同的伙伴关系。
解决方法
与其尝试将 (A,B) 和 (B,A) 视为相同,您可以任意决定始终让 A 具有较低的 ID (*),并使用约束对其进行备份;
CREATE TABLE partner (
a INT NOT NULL,b INT NOT NULL,PRIMARY KEY (a,b),CHECK (a < b),FOREIGN KEY (a) REFERENCES user(id),FOREIGN KEY (b) REFERENCES user(id)
)
(*) 或者更大的 - 这并不重要,只要你保持一致。
,您有两个选择。一种是确保 (a,b)
和 (b,a)
都在表中。您可以在插入行时使用触发器执行此操作。
第二种是只包含一对中的一个——通常作为一个有序对。
基本上,这取决于您将如何使用该表。第一种方法需要两倍的存储空间,但获取给定用户的所有合作伙伴更简单。
,如果您想确保两个对都必须包含在表中,那么只需添加另一个约束:
ALTER TABLE Partner ADD FOREIGN KEY (User2,User1) REFERENCES Partner (User1,User2);