MySQL 复合唯一键如何与引用同一列的两个外键字段一起使用?

How does a MySQL composite unique key work with two foreign key fields referencing the same column?

假设我有以下 tables(我不是真的这只是为了举例):

CREATE TABLE PERSON(
  ID BIGINT NOT NULL AUTO_INCREMENT,
  PRIMARY KEY(ID)
);

CREATE TABLE FRIENDSHIP(
  ID BIGINT NOT NULL AUTO_INCREMENT,
  PERSON_ID_A BIGINT NOT NULL,
  PERSON_ID_B BIGINT NOT NULL,
  PRIMARY KEY(ID),
  FOREIGN KEY(PERSON_ID_A) REFERENCES PERSON(ID),
  FOREIGN KEY(PERSON_ID_B) REFERENCES PERSON(ID)
);

人table代表人,友情table代表人与人之间的友谊

我想允许两个不同的人之间只存在一个友谊记录,所以我的第一反应是在友谊中添加以下内容table:

UNIQUE KEY(PERSON_ID_A, PERSON_ID_B)

但是我怀疑如果发生以下情况,这仍然会允许两个人之间形成多重友谊:

INSERT INTO FRIENDSHIP(PERSON_ID_A, PERSON_ID_B) VALUES (1, 2);
INSERT INTO FRIENDSHIP(PERSON_ID_A, PERSON_ID_B) VALUES (2, 1);

上面的单个唯一键是否会阻止此插入对成功应用?如果没有,是否有可能阻止他们使用复合唯一键的一些特殊变体,或者我是否需要在触发器中处理它?如果单个唯一键确实阻止了上述插入,我该如何允许它们?

您可以创建一个索引,以便使用 leastgreatest 函数只允许使用一次组合。

create unique index idx_PersonA_PersonB on 
FRIENDSHIP(least(PERSON_ID_A, PERSON_ID_B), greatest(PERSON_ID_A, PERSON_ID_B));