Ama*_*anS 55 sql foreign-keys primary-key
我只是认为答案是错误的,因为外键没有uniqueness属性.
但是有些人说它可以在自我加入桌子的情况下.我是新来的SQL.如果是真的请解释如何以及为什么?
Employee table
| e_id | e_name  | e_sala  |  d_id  |
|----  |-------  |-----    |--------|
|  1   |   Tom   |  50K    |    A   |
|  2   | Billy   |  15K    |    A   |
|  3   | Bucky   |  15K    |    B   |
department table
| d_id | d_name  |
|----  |-------  |
|  A   |   XXX   | 
|  B   |   YYY   | 
现在,d_id是外键,所以它如何成为主键.并解释一下join.有什么用?
mvs*_*gar 72
我认为这个问题有点令人困惑.
如果你的意思是"外键可以在同一个表中引用'主键吗?",答案是坚定的,因为有些回复.例如,在员工表中,员工的行可能有一列用于存储经理的员工编号,其中经理也是员工,因此表中的行会像任何其他员工的行一样.
如果你的意思是"可以列(或列集)是主键还是同一个表中的外键?",在我看来,答案是否定的; 这看起来毫无意义.但是,以下定义在SQL Server中成功!
create table t1(c1 int not null primary key foreign key references t1(c1))
但我认为除非有人提出一个实际的例子,否则有这样的约束是没有意义的.
AmanS,在您的示例中,d_id在任何情况下都不能成为Employee表中的主键.一个表只能有一个主键.我希望这能清除你的怀疑.d_id是/可以是仅在department表中的主键.
小智 17
这可能是一个很好的解释示例
CREATE TABLE employees (
id INTEGER NOT NULL PRIMARY KEY,
managerId INTEGER REFERENCES employees(id), 
name VARCHAR(30) NOT NULL
);
INSERT INTO employees(id, managerId, name) VALUES(1, NULL, 'John');
INSERT INTO employees(id, managerId, name) VALUES(2, 1, 'Mike');
-- 说明: -- 在本例中。-- 约翰是迈克的经理。迈克不管理任何人。-- Mike 是唯一一个不管理任何人的员工。
ryv*_*age 16
当然,为什么不呢?比方说,你有一个Person表,其中id,name,age,和parent_id,其中parent_id是一个外键相同的表.您不需要将Person表规范化为表Parent和Child表,这将是过度的.
Person
| id |  name | age | parent_id |
|----|-------|-----|-----------|
|  1 |   Tom |  50 |      null |
|  2 | Billy |  15 |         1 |
像这样的东西.
我想保持一致性,但是至少需要1个空值parent_id.一个"阿尔法男性"排.
编辑:正如评论所示,Sam找到了一个不这样做的好理由.在MySQL中,当您尝试对主键进行编辑时,即使您指定CASCADE ON UPDATE它也不会正确传播编辑.虽然主键(通常)禁止在生产中进行编辑,但它仍然是一个不容忽视的限制.因此,我改变了我的答案: - 你应该避免这种做法,除非你对生产系统有非常严格的控制(并且可以保证没有人会实施编辑PK的控制).我没有在MySQL之外测试它.
| 归档时间: | 
 | 
| 查看次数: | 93298 次 | 
| 最近记录: |