在MySQL中的链接表中实现UNIQUE

时间:2009-09-20 21:41:58

标签: sql mysql database-design constraints data-modeling

用户是PERSON,PERSON有公司 - 用户 - >人是一对一的人 - >公司是多对一的。

person_id是USER表中的FK。 company_id在PERSON表中是FK。

PERSON可能不是用户,但用户始终是PERSON。

如果company_id在user表中,我可以根据username和company_id创建一个唯一的密钥,但它不是,如果是的话,它将是一个重复的数据。

目前,我正在RoseDB管理器包装器代码中实现唯一的用户名/公司ID规则,但感觉不对。如果可以的话,我想在数据库级别定义唯一规则,但我不确定如何处理它。我试过这样的事情:

alter table user add unique(used_id,person.company_id);

但这不起作用。

通过阅读文档,我找不到一个做任何甚至远程相似的例子。我是否尝试添加不存在的功能,或者我在这里遗漏了什么?

3 个答案:

答案 0 :(得分:1)

嗯,没有什么简单可以做你想要的。但是,您可以使用BEFORE INSERTBEFORE UPDATE triggers强制执行所需的约束。请参阅this SO question about raising MySQL errors了解如何处理触发器失败。

答案 1 :(得分:1)

您可以在UNIQUE表中定义Person约束:

CREATE TABLE Company (
 company_id SERIAL PRIMARY KEY
) ENGINE=InnoDB;

CREATE TABLE Person (
 person_id SERIAL PRIMARY KEY,
 company_id BIGINT UNSIGNED,
 UNIQUE KEY (person_id, company_id),
 FOREIGN KEY (company_id) REFERENCES Company (company_id)
) ENGINE=InnoDB;

CREATE TABLE User (
 person_id BIGINT UNSIGNED PRIMARY KEY,
 FOREIGN KEY (person_id) REFERENCES Person (person_id)
) ENGINE=InnoDB;

但实际上即使在Person表中也不需要唯一约束,因为person_id本身就是唯一的。给定的person_id无法引用两家公司。

所以我不确定你要解决的问题是什么。


重新评论:

  

这并不能解决允许相同用户名存在于不同公司的问题。

因此,您希望给定的用户名在一家公司内是唯一的,但可以在不同的公司中使用?我原来的问题并不清楚。

因此,如果您没有特定于用户的许多其他属性,我会将User与Person结合使用,并添加“is_user”列。或者只是依赖它是隐含的,具有非空加密的Person根据定义是用户。

然后您的跨表UNIQUE约束的问题就消失了。

答案 2 :(得分:1)

PERSON表有更多属性吗?我问的原因是你想要实现的是一个典型的推论表:

USERS 表格:

  • user_id(pk)

USER_COMPANY_XREF (nee PERSON)表:

  • user_id(pk,fk)
  • company_id(pk,fk)
  • EFFECTIVE_DATE(非null)
  • EXPIRY_DATE(非空)

COMPANIES 表格:

  • company_id(pk)

USER_COMPANY_XREF 表的主键是USERS.user_idCOMPANIES.company_id的复合键,可让您将用户与多个公司关联不重复USERS表中的数据,并提供参考完整性。