首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >外键可以引用它自己表的主键吗?

外键可以引用它自己表的主键吗?
EN

Stack Overflow用户
提问于 2014-06-17 10:11:49
回答 3查看 2.9K关注 0票数 6

我正在创建一个用于工作的MySQL员工数据库,并希望它存储员工的主管。

假设我有一个名为“employee”的表,其字段为' ID‘、'first_name’、‘supv_id_name’,其中'id‘是主键,'supv_id’是引用和employee ID的外键。

目前,我有'supv_id‘作为一个外键,指向一个单独的表’主管‘。这个表由'id‘和'empl_id’组成,它们指向employee表。但是,如果有一种方法可以简单地使“supv_id”在“employee”中指向“Employee.id”,这将完全消除对“主管”表的需求。下面是一个示例:

代码语言:javascript
运行
AI代码解释
复制
+----+--------+-----------+---------+
| id | f_name | l_name    | supv_id |
+----+--------+-----------+---------+ 
|  1 | Han    | Solo      |    NULL | //Or 0?
|  2 | Luke   | Skywalker |       1 |
+----+--------+-----------+---------+

简而言之,我希望'supv_id‘指向另一个员工。这有道理吗?我该怎么做呢?

谢谢!

编辑:固定表

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-06-17 13:30:23

您可以如下所示创建这样一个表:

代码语言:javascript
运行
AI代码解释
复制
CREATE TABLE laya2 (
    id INT NOT NULL PRIMARY KEY,
    f_name VARCHAR(20),
    l_name VARCHAR(20),
    supv_id INT,
    INDEX supv_id_idx (supv_id),
    FOREIGN KEY (supv_id)
        REFERENCES laya2(id) 
        ON DELETE SET NULL      -- example for an action
) ENGINE=INNODB;

我的示例将引用选项设置为NULL,因为我认为这里的引用选项是逻辑的。如果一个监督他人的员工离开了,那么这些员工首先就没有主管。另一种选择是拥有NO ACTION,因为您可以很容易地识别那些没有有效主管的员工,并为他们找到一个新的主管。ON DELETE CASCADE在这里是错的,因为那些员工不会同时离开.

可以将员工插入

代码语言:javascript
运行
AI代码解释
复制
INSERT INTO laya2 VALUES
(1, 'Han', 'Solo', NULL),
(2, 'Luke', 'Skywalker', 1);

(两次成功插入),但没有使用

代码语言:javascript
运行
AI代码解释
复制
INSERT INTO laya2 VALUES
(3, 'Anakin', 'Skywalker', 0);

此语句将失败,因为外键约束失败。

删除Han将卢克天行者的supv_id更改为NULL,因为引用选项ON DELETE SET NULL

代码语言:javascript
运行
AI代码解释
复制
DELETE FROM laya2 WHERE id = 1;    -- this will set the supv_id for Luke Skywalker to NULL
票数 3
EN

Stack Overflow用户

发布于 2014-06-17 11:22:07

是的,自己加入这张桌子。以下是许多方法中的一个:

代码语言:javascript
运行
AI代码解释
复制
SELECT a.l_name AS employee, b.l_name AS supervisor 
  FROM employee AS a, employee AS b 
  WHERE a.supv_id = b.id             -- link tables
    AND a.id = 2                     -- get employee

返回:

代码语言:javascript
运行
AI代码解释
复制
employee  | supervisor
----------+-----------
Skywalker | Solo
票数 3
EN

Stack Overflow用户

发布于 2014-06-17 14:39:30

是的,您可以定义一个外键,该外键引用它自己表的主键。

代码语言:javascript
运行
AI代码解释
复制
create table employee (id int(10),
                       f_name varchar(10),
                       l_name varchar(10),
                       supv_id int(10)) ENGINE=InnoDB;
alter table employee add primary key (id);
alter table employee add foreign key (supv_id) references employee (id);

没有主管的员工必须在supv_id列中为NULL。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24270621

复制
相关文章

相似问题

领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文