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);
上面的单个唯一键是否会阻止此插入对成功应用?如果没有,是否有可能阻止他们使用复合唯一键的一些特殊变体,或者我是否需要在触发器中处理它?如果单个唯一键确实阻止了上述插入,我该如何允许它们?
您可以创建一个索引,以便使用 least
和 greatest
函数只允许使用一次组合。
create unique index idx_PersonA_PersonB on
FRIENDSHIP(least(PERSON_ID_A, PERSON_ID_B), greatest(PERSON_ID_A, PERSON_ID_B));
假设我有以下 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);
上面的单个唯一键是否会阻止此插入对成功应用?如果没有,是否有可能阻止他们使用复合唯一键的一些特殊变体,或者我是否需要在触发器中处理它?如果单个唯一键确实阻止了上述插入,我该如何允许它们?
您可以创建一个索引,以便使用 least
和 greatest
函数只允许使用一次组合。
create unique index idx_PersonA_PersonB on
FRIENDSHIP(least(PERSON_ID_A, PERSON_ID_B), greatest(PERSON_ID_A, PERSON_ID_B));