2

我是 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 张幻灯片中给出的表格:关系数据模型和关系数据库约束

约束是:

  1. EMPLOYEE 的 SUPERSSN 引用 EMPLOYEE 的 SSN。
  2. DEPARTMENT 的 MRSSN 引用 EMPLOYEE 的 SSN。
  3. EMPLOYEEE 的 DNO 引用 DEPARTMENT 的 DNumber。

创建表后,如何添加记录?它总是会失败外键约束。

4

3 回答 3

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
于 2012-09-19T07:24:18.583 回答
2

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

SET FOREIGN_KEY_CHECKS = 0; 
INSERT INTO EMPLOYEE VALUES('12345','67890'),('67890','12345');
SET FOREIGN_KEY_CHECKS = 1;
于 2015-12-02T01:59:07.223 回答
1

它显然会失败,因为表是空的。

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

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

于 2012-09-19T07:17:48.873 回答