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

302*_*aya 5 mysql database relational-database

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

假设我有一个名为“ employee”的表,其中的字段为“ id”,“ first_name”,“ last_name”和“ supv_id”,其中“ id”是主键,“ supv_id”是一个外键,它引用了员工ID 。

目前,我有“ supv_id”作为外键,它指向一个单独的表“ supervisor”。该表仅由指向员工表的'id'和'empl_id'组成。但是,如果有一种方法可以简单地使“ employee”中的“ supv_id”指向“ employee.id”,则将完全不需要我的“ supervisor”表。这是一个例子:

+----+--------+-----------+---------+
| id | f_name | l_name    | supv_id |
+----+--------+-----------+---------+ 
|  1 | Han    | Solo      |    NULL | //Or 0?
|  2 | Luke   | Skywalker |       1 |
+----+--------+-----------+---------+
Run Code Online (Sandbox Code Playgroud)

简而言之,我希望“ supv_id”指向另一名员工。这有意义吗?我将如何去做呢?

谢谢!

编辑:固定表

VMa*_*Mai 3

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

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

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

您可以插入员工

INSERT INTO laya2 VALUES
(1, 'Han', 'Solo', NULL),
(2, 'Luke', 'Skywalker', 1);
Run Code Online (Sandbox Code Playgroud)

(两次成功插入),但不包括

INSERT INTO laya2 VALUES
(3, 'Anakin', 'Skywalker', 0);
Run Code Online (Sandbox Code Playgroud)

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

由于参考选项,删除汉·索罗会将卢克·天行者的supv_id更改为NULLON DELETE SET NULL

DELETE FROM laya2 WHERE id = 1;    -- this will set the supv_id for Luke Skywalker to NULL
Run Code Online (Sandbox Code Playgroud)