外键是否可以引用自己的表的主键?

时间:2014-06-17 18:11:50

标签: mysql database relational-database

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

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

目前我将'supv_id'作为外键指向一个单独的表'supervisor'。该表只包含'id'和'empl_id',它们指向employee表。但是,如果有一种方法可以简单地将'employee'中的'supv_id'指向'employee.id',这将完全消除我'supervisor'表的需要。这是一个例子:

+----+--------+-----------+---------+
| id | f_name | l_name    | supv_id |
+----+--------+-----------+---------+ 
|  1 | Han    | Solo      |    NULL | //Or 0?
|  2 | Luke   | Skywalker |       1 |
+----+--------+-----------+---------+

简而言之,我希望'supv_id'指向另一名员工。这有意义吗?我该怎么做呢?

谢谢!

编辑:固定表

3 个答案:

答案 0 :(得分:2)

是的,加入桌子给自己。以下是众多方法之一:

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

返回:

employee  | supervisor
----------+-----------
Skywalker | Solo

答案 1 :(得分:2)

您可以创建如下表格:

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;

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

您可以使用

插入员工
INSERT INTO laya2 VALUES
(1, 'Han', 'Solo', NULL),
(2, 'Luke', 'Skywalker', 1);

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

INSERT INTO laya2 VALUES
(3, 'Anakin', 'Skywalker', 0);

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

删除Han Solo会将Luke Skywalker的supv_id更改为NULL,因为引用选项ON DELETE SET NULL

DELETE FROM laya2 WHERE id = 1;    -- this will set the supv_id for Luke Skywalker to NULL

答案 2 :(得分:1)

是的,您可以定义引用其自己的表的主键的外键。

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。