mysql - 在相互引用的表中使用外键的正确方法是什么

标签 mysql sql

表将生成,但每次我尝试将值插入表中时,我都会收到外键约束失败的 1452 错误。我想知道这个问题是否与 EMPLOYEE 表在 STORE 表中有一个 STORE_CODE 的外键有关,而 STORE 表在 EMPLOYEE 表中有一个 EMP_CODE 的外键。循环引用是这里的问题吗?

ALTER TABLE EMPLOYEE DROP FOREIGN KEY STORE_CD;
ALTER TABLE STORE DROP FOREIGN KEY REGION_CD;
ALTER TABLE STORE DROP FOREIGN KEY EMPLOYEE_CD;

DROP TABLE IF EXISTS EMPLOYEE, REGION, STORE;

CREATE TABLE EMPLOYEE (
    EMP_CODE int NOT NULL PRIMARY KEY,
    EMP_TITLE varchar(4),
    EMP_LNAME varchar(15),
    EMP_FNAME varchar(15),
    EMP_INITIAL varchar(1),
    EMP_DOB datetime,
    STORE_CODE int NOT NULL
) Engine=InnoDB;

-- Table Region
CREATE TABLE REGION (
    REGION_CODE int NOT NULL PRIMARY KEY,
    REGION_DESCRIPT varchar(20)
) Engine=InnoDB;

-- Table Store
CREATE TABLE STORE (
    STORE_CODE int NOT NULL PRIMARY KEY,
    STORE_NAME varchar(20)  NOT NULL,
    STORE_YTD_SALES numeric  NOT NULL,
    REGION_CODE int  NOT NULL,
    EMP_CODE int  NOT NULL
) Engine=InnoDB;



ALTER TABLE EMPLOYEE ADD CONSTRAINT STORE_CD 
      FOREIGN KEY STORE_CD(STORE_CODE) REFERENCES STORE(STORE_CODE);

ALTER TABLE STORE ADD CONSTRAINT REGION_CD 
      FOREIGN KEY REGION_CD(REGION_CODE) REFERENCES REGION(REGION_CODE);

ALTER TABLE STORE ADD CONSTRAINT EMPLOYEE_CD 
      FOREIGN KEY EMPLOYEE_CD(EMP_CODE) REFERENCES EMPLOYEE(EMP_CODE);

最佳答案

不可能有相互外键,除非您允许至少其中一列为 NULL。否则你永远不可能有一组一致的表:如果你先添加商店,它将引用一个不存在的员工;如果您先添加员工,它将引用一个不存在的商店。

因此您需要允许引用列为NULL。然后,您可以向第一个表中的引用列中添加一行 NULL,向第二个表中添加一行,然后使用第二个表中的 ID 填充第一个表中的引用列。

关于mysql - 在相互引用的表中使用外键的正确方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35330023/

相关文章:

php - 输入值取决于数据库中下拉列表的值

mysql - 从多个表中计数

mysql - 如何更改mysql用户权限?

mysql - 我怎样才能得到一行以及所有相关行的数量?

JavaDB - 几个表之间的自动增量

mysql - 使用 MySQL 以分钟为单位获取日期差异

sql - 插入带有 if else 条件的 select

php - 使用 CURRENT_DATE 的 MySQL 旧代码不准确

python - 为什么在 Django 中使用 callproc() 时出现 PROCEDURE 不存在?

sql - 在窗口函数中计算运行总和