用户是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);
但这不起作用。
通过阅读文档,我找不到一个做任何甚至远程相似的例子。我是否尝试添加不存在的功能,或者我在这里遗漏了什么?
答案 0 :(得分:1)
嗯,没有什么简单可以做你想要的。但是,您可以使用BEFORE INSERT
和BEFORE 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_COMPANY_XREF
(nee PERSON)表:
COMPANIES
表格:
USER_COMPANY_XREF
表的主键是USERS.user_id
和COMPANIES.company_id
的复合键,可让您将用户与多个公司关联不重复USERS
表中的数据,并提供参考完整性。