2013-03-16 194 views
1

我想有一个查询表,将两个相同的东西链接到彼此。假设我有一个'人'表,我想查找两个人之间的关系。我将在第一列中查找'PersonId1',第二列为'PersonId2',第三列为'关系'。由于这种关系是双向的,所以我不需要在PlayerId被切换时重复记录。是否有任何方法可以使mysql在PlayerId1和PlayerId2组合上强制实现唯一性,而不管它们的顺序如何?Mysql复合主键

这有道理吗?

回答

0

你的意思是你想从PersonID1PersonID2列中获得唯一的行记录(不管Relationship列)?如果是这样,你可以使用复合键(多列键)。

下面是一个例子:

CREATE TABLE Person (
    PersonId1 INT, 
    PersonId2 INT, 
    PRIMARY KEY (PersonId1, PersonId2) 
) 
+0

是,但如果PersonId1就是9和PersonId2为10在一个记录中,但在另一个PersonId1中是10和personId2 9.这重新定义了同样的关系。我想知道是否有办法阻止这种情况发生。 – ForeverNoobie 2013-03-16 14:39:53

+0

如果排序是你的情况,你可以使用一个单一的领域中,具有'varchar'数据类型,然后串联的'PersonId1'和'PersonId2'。并且不要忘记将它作为您的主要关键。 – 2013-03-16 14:44:07

+0

你必须尝试成对插入它们,否则这将不起作用。 'INSERT INTO关系(PersonId1,PersonId2)VALUES(9,10),(10,9)'和交易将失败,如果一个或多个这些对冲突。 – tadman 2013-03-16 15:10:16

2

简短的回答:第

较长的答案:你可以设置一个触发交换两个人ID的顺序,如果第二个比第一个更小,然后编写它们,并使用复合键。

甚至更​​长的回答:不是所有的人际关系是可交换的(不是所有的关系是双向的)。那么“员工”或“母亲”关系呢?即使是“朋友”关系,大概是点对点,如果你有单独的行说A是B的朋友而B是A的朋友,那么这种关系可能会更好。所以也许你想在这个表上使用三字段的组合键。

+0

+1'三字段复合键' – 2013-03-16 14:55:26

0

+1为复合包装。为了防止重复组合,与例如personid1 + personid2上有一个独特的约束可能是一个解决一个额外的varchar列...

参见:person data model example