【问题标题】:Mysql composite primary keyMysql复合主键
【发布时间】:2013-03-05 05:29:01
【问题描述】:

我想要一个将两个相同的事物相互链接的查找表。假设我有一个“人”表,我想查找两个人之间的关系。我将查找的第一列是“PersonId1”,第二列是“PersonId2”,第三列是“关系”。由于关系是双向的,因此我不需要在 PlayerId 切换时重复记录。有什么方法可以让 mysql 对 PlayerId1 和 PlayerId2 组合强制唯一性,而不管它们的顺序是什么?

这有意义吗?

【问题讨论】:

    标签: mysql database-design primary-key


    【解决方案1】:

    简短回答:不。

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

    更长的答案:并非所有人际关系都是可交换的(并非所有关系都是双向的)。 “员工”或“母亲”关系呢?如果你有单独的行说 A 是 B 的朋友,B 是 A 的朋友,即使是可能是点对点的“朋友”关系也可能会更好地表示。因此,也许您想要此表上的三字段复合键。

    【讨论】:

      【解决方案2】:

      您的意思是您希望拥有来自PersonID1PersonID2 列的唯一行记录(不管Relationship 列)?如果是这样,您可以使用复合键(多列键)。

      这是一个例子:

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

      【讨论】:

      • 是的,但是如果在一条记录中 PersonId1 为 9,PersonId2 为 10,但在另一条记录中,PersonId1 为 10,personId2 为 9。这重新定义了相同的关系。我想知道是否有办法防止这种情况发生。
      • 如果排序是您的情况,您可以使用具有varchar 数据类型的单个字段,然后连接PersonId1PersonId2。别忘了把它作为你的主键。
      • 您必须尝试将它们成对插入,否则将不起作用。 INSERT INTO relationship (PersonId1,PersonId2) VALUES (9,10),(10,9) 如果其中一对或多对发生冲突,则交易将失败。
      • @tadman,如果它失败了,那只意味着记录本身有问题。并且您可以确保所有记录都是唯一的。
      【解决方案3】:

      +1 表示复合 pk。为防止重复组合,一个额外的 varchar 列(例如 personid1+personid2 对其具有唯一约束)可能是一种解决方案...

      另请参阅:person data model example

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-07-04
        • 1970-01-01
        • 2023-04-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多