将主键应用于mysql中的多个列

时间:2012-08-23 10:19:19

标签: mysql primary-key

我有3列:

-> person(varchar(50))
-> related_with(varchar(50))
-> relationship(varchar(50))

以上3的组合是主键

现在,例如,将值赋予3列:

person -> User
related_with -> User1
relationship -> Son of

问题在于,如果我将值添加为

person -> User1
related_with -> User
relationship -> Son of 

然后它被成功插入..但不应该是这种情况,因为在这种情况下反之亦然是真的

这个问题有解决方案吗?

2 个答案:

答案 0 :(得分:1)

大多数情况下,此类验证应在应用程序代码级别进行。但是,如果您必须在数据库中执行此操作,请考虑编写trigger

这确实是一个复杂的逻辑和验证(在应用程序或触发器中)。可能有各种情况: 1.考虑relationship -> friend of。这里的反向关系与son of不同。

  1. 考虑relationship -> brother of。在这种情况下,如果两个用户都是男性,则可以是反向关系,但如果用户是女性则不可以。同上relationship -> sister of
  2. 因此,您需要仔细设置一种存储方式以查看您的关系,以及您是否想要硬化逻辑或使用标记来识别关系类型。

答案 1 :(得分:1)

使(person,related_with)成为关键。像“兄弟”这样的相互关系是隐含的,因此您不一定需要两行来表示它们。现在您可以添加CHECK约束:

ALTER TABLE tbl ADD CONSTRAINT ck1 CHECK(person< related_with);

对于各种关系来说,这不是一个完美的解决方案,但它确实减少了冗余的数量和潜在的异常数量,并且它以声明方式强制执行规则,而不是作为触发器中的过程代码。