我正在为工作创建一个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'指向另一名员工。这有意义吗?我该怎么做呢?
谢谢!
编辑:固定表
答案 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。