如何在自引用表中添加记录?

时间:2012-09-19 07:12:31

标签: mysql sql database self-referencing-table

我是MySql中的菜鸟。我想创建以下自引用表:

EMPLOYEE
+-----+------+------+
|Name |E-ID  |M-ID  |
+-----+------+------+
|ABC  |12345 |67890 |
|DEF  |67890 |12345 |
+-----+------+------+

我使用以下命令:

CREATE TABLE EMPLOYEE (
    NAME VARCHAR(20) ,
    E-ID CHAR(6) NOT NULL ,
    M-ID CHAR(6) NULL ,
    PRIMARY KEY (E-ID) ,
    FOREIGN KEY (M-ID) REFERENCES EMPLOYEE(E-ID)
    );

现在问题是,如何输入两条记录?我的意思是,每次外部约束都会失败。我试着进入:

INSERT INTO EMPLOYEE VALUES('12345','67890');

我也尝试过:

INSERT INTO EMPLOYEE VALUES('12345','67890'),('67890','12345');

以上两个命令都失败了。给出错误:

  

错误1452(23000):无法添加或更新子行:外键   约束失败BLAH BLAH

伙计们,实际上我正在尝试实施以下ppt的幻灯片编号25中给出的表格:The Relational Data Model and Relational Database Constraints

约束是:

  1. 雇员的SUPERSSN参考雇员的SSN。
  2. 部门的MGRSSN参考了员工的SSN。
  3. EMPLOYEEE的DNO参考了DEPARTMENT的DNumber。
  4. 创建表格后,如何添加记录?它总是会失败外键约束。

3 个答案:

答案 0 :(得分:4)

由于MySQL不支持可延迟约束(这是解决此类问题的“天然解决方案”),因此您需要分两步完成此操作;

INSERT INTO employee (name, `E-ID`) values ('Arthur', '123456');
INSERT INTO employee (name, `E-ID`) values ('Ford', '67890');
UPDATE employee 
    SET `M-ID` = '67890' 
WHERE `E-ID` = '123456';

UPDATE employee 
    SET `M-ID` = '123456' 
WHERE `E-ID` = '67890';

你的循环引用对我来说听起来很奇怪。一名员工是一名员工的经理,而该员工又是他的经理?

请允许我对您的表格定义发表两条评论:

  • 避免使用需要带引号标识符的特殊字符的列(或表名)。从长远来看,使用E_ID代替E-ID可以省去一些麻烦
  • 如果您的员工ID可能少于6个字符,那么由于使用VARCHAR(6)数据类型填充值,您最有可能希望使用CHAR(6)而不是CHAR

答案 1 :(得分:1)

显然会因为表格为空而失败。

INSERT INTO EMPLOYEE VALUES('12345','67890');

由于M-ID取决于E-ID。删除约束,以便您可以插入记录。您要做的最好的事情是为M-ID创建另一个表并将其引用到Employee表。

答案 2 :(得分:1)

这里有很好的答案,但我想我会指出快速和肮脏的:

SET FOREIGN_KEY_CHECKS = 0; 
INSERT INTO EMPLOYEE VALUES('12345','67890'),('67890','12345');
SET FOREIGN_KEY_CHECKS = 1;