表将构建,但每次我尝试在表中插入值时,我得到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);
答案 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。
这是最有效的方法,可以加快查询速度。
希望它有所帮助。