我正在创建一个用于工作的MySQL员工数据库,并希望它存储员工的主管。
假设我有一个名为“employee”的表,其字段为' ID‘、'first_name’、‘supv_id_name’,其中'id‘是主键,'supv_id’是引用和employee ID的外键。
目前,我有'supv_id‘作为一个外键,指向一个单独的表’主管‘。这个表由'id‘和'empl_id’组成,它们指向employee表。但是,如果有一种方法可以简单地使“supv_id”在“employee”中指向“Employee.id”,这将完全消除对“主管”表的需求。下面是一个示例:
+----+--------+-----------+---------+
| id | f_name | l_name | supv_id |
+----+--------+-----------+---------+
| 1 | Han | Solo | NULL | //Or 0?
| 2 | Luke | Skywalker | 1 |
+----+--------+-----------+---------+
简而言之,我希望'supv_id‘指向另一个员工。这有道理吗?我该怎么做呢?
谢谢!
编辑:固定表
发布于 2014-06-17 13:30:23
您可以如下所示创建这样一个表:
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
在这里是错的,因为那些员工不会同时离开.
可以将员工插入
INSERT INTO laya2 VALUES
(1, 'Han', 'Solo', NULL),
(2, 'Luke', 'Skywalker', 1);
(两次成功插入),但没有使用
INSERT INTO laya2 VALUES
(3, 'Anakin', 'Skywalker', 0);
此语句将失败,因为外键约束失败。
删除Han将卢克天行者的supv_id更改为NULL,因为引用选项ON DELETE SET NULL
DELETE FROM laya2 WHERE id = 1; -- this will set the supv_id for Luke Skywalker to NULL
发布于 2014-06-17 11:22:07
是的,自己加入这张桌子。以下是许多方法中的一个:
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
发布于 2014-06-17 14:39:30
是的,您可以定义一个外键,该外键引用它自己表的主键。
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。
https://stackoverflow.com/questions/24270621
复制相似问题