我是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
约束是:
创建表格后,如何添加记录?它总是会失败外键约束。
答案 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
可以省去一些麻烦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;