外键是否可以引用同一个表中的主键?

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   | 
Run Code Online (Sandbox Code Playgroud)

现在,d_id是外键,所以它如何成为主键.并解释一下join.有什么用?

mvs*_*gar 72

我认为这个问题有点令人困惑.

如果你的意思是"外键可以在同一个表中引用'主键吗?",答案是坚定的,因为有些回复.例如,在员工表中,员工的行可能有一列用于存储经理的员工编号,其中经理也是员工,因此表中的行会像任何其他员工的行一样.

如果你的意思是"可以列(或列集)是主键还是同一个表中的外键?",在我看来,答案是否定的; 这看起来毫无意义.但是,以下定义在SQL Server中成功!

create table t1(c1 int not null primary key foreign key references t1(c1))
Run Code Online (Sandbox Code Playgroud)

但我认为除非有人提出一个实际的例子,否则有这样的约束是没有意义的.

AmanS,在您的示例中,d_id在任何情况下都不能成为Employee表中的主键.一个表只能有一个主键.我希望这能清除你的怀疑.d_id是/可以是仅在department表中的主键.

  • @AmanS,这可能就是你想要的.select语句"SELECT DISTINCT e.e_id AS'Manager Id',e.e_name AS'Manager Name'FROM employee e,employee m WHERE e.e_id = m.e_mgr;" 为您提供所有经理员工.这里将主键列e_id与外键列e_mgr进行比较. (2认同)

小智 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');
Run Code Online (Sandbox Code Playgroud)

-- 说明: -- 在本例中。-- 约翰是迈克的经理。迈克不管理任何人。-- Mike 是唯一一个不管理任何人的员工。


ryv*_*age 16

当然,为什么不呢?比方说,你有一个Person表,其中id,name,age,和parent_id,其中parent_id是一个外键相同的表.您不需要将Person表规范化为表ParentChild表,这将是过度的.

Person
| id |  name | age | parent_id |
|----|-------|-----|-----------|
|  1 |   Tom |  50 |      null |
|  2 | Billy |  15 |         1 |
Run Code Online (Sandbox Code Playgroud)

像这样的东西.

我想保持一致性,但是至少需要1个空值parent_id.一个"阿尔法男性"排.

编辑:正如评论所示,Sam找到了一个不这样做的好理由.在MySQL中,当您尝试对主键进行编辑时,即使您指定CASCADE ON UPDATE它也不会正确传播编辑.虽然主键(通常)禁止在生产中进行编辑,但它仍然是一个不容忽视的限制.因此,我改变了我的答案: - 你应该避免这种做法,除非你对生产系统有非常严格的控制(并且可以保证没有人会实施编辑PK的控制).我没有在MySQL之外测试它.


Nim*_*a V 7

例如:n类别的子类别级别.下表主键ID由外键sub_category_id引用

在此输入图像描述