在表中引用外键的正确方法是什么?

时间:2016-02-11 02:58:58

标签: 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);

4 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:0)

您想先插入哪一个?如果EMPLOYEE然后在EMPLOYEE中生成STORE_CD(nullable = true)之后使用EMPLOYEE id插入STORE项目并使用商店代码更新EMPLOYEE。您可以在整个过程中使用Transaction。

答案 2 :(得分:0)

由于我缺乏对SQL的理解,对我来说最简单的解决方案是从employee表中删除外键,以便我没有循环引用。然后在其后的表中首先填充employee表。

答案 3 :(得分:0)

根据我对关系数据库的经验,我认为你应该创建一个 中间表,以便"存储"与"员工" (让我们用atributes(idstore(fk),idemployee(fk)和isManager(boolean))命名它(store_has_employee)。

然后你应该插入"区域"首先,您可以插入"商店",然后当您注册"员工"时,您所要做的就是在" store_has_employee"中将它们联系起来,如果你想说那是经理,只需插入isManager = true。

这是最有效的方法,可以加快查询速度。

希望它有所帮助。