尝试将值INSERT到包含相互引用的FOREIGN KEYS的表中

时间:2014-05-26 05:18:11

标签: mysql reference insert foreign-keys

所以我试图根据规格表创建一个数据库(给出了ER图和DB模式),并且表单指定前两个表包含对彼此的引用,如下所示:

WAREHOUSE
Column name Data type   Comments
warehouseID VARCHAR(3)  Primary key
street      VARCHAR(20) 
city        VARCHAR(15) 
state       VARCHAR(3)  Examples – VIC, NSW, QLD
postcode    VARCHAR(4)  Examples – 3350, 2001, 3001
managerID   INT         FK–References EMPLOYEE.StaffID

EMPLOYEE
Column name Data type   Comments
staffID     INT A_I     Primary key 
surname     VARCHAR(20) 
firstName   VARCHAR(15) 
dob Date    Short date– Example 06/09/1982
street      VARCHAR(20) 
city        VARCHAR(15) 
state       VARCHAR(3)  Examples – VIC, NSW, QLD, TAS
postcode    VARCHAR(4)  Examples – 3350, 3355, 2001, 3001
salary      Decimal(19,4)   
warehouseID VARCHAR(3)  FK – References WAREHOUSE. warehouseID
supervisedBy INT        FK – References EMPLOYEE.StaffID

我的MySQL创建代码如下*我在创建表格后将最后一列添加到“仓库”,因为由于两者中包含FK,我无法一个接一个地创建ehm:

CREATE DATABASE IF NOT EXISTS WareMart_30114465;
USE WareMart_30114465;
CREATE TABLE IF NOT EXISTS Warehouse
(
warehouseID VARCHAR(3) NOT NULL,
street VARCHAR(20),
city VARCHAR(15), 
statesh VARCHAR(3), 
postcode VARCHAR(4),
PRIMARY KEY (warehouseID)
);
CREATE DATABASE IF NOT EXISTS WareMart_30114465;
USE WareMart_30114465;
CREATE TABLE Employee
(
staffID INT NOT NULL AUTO_INCREMENT,
surname VARCHAR(20),
firstName VARCHAR(15),
dob date,
street VARCHAR(20),
city VARCHAR(15), 
statesh VARCHAR(3), 
postcode VARCHAR(4), 
salary DECIMAL(19,4),
warehouseID VARCHAR(3),
PRIMARY KEY (staffID),
FOREIGN KEY (warehouseID) REFERENCES Warehouse(warehouseID)
);
CREATE DATABASE IF NOT EXISTS WareMart_30114465;
USE WareMart_30114465;
ALTER TABLE Warehouse ADD managerID INT NOT NULL;
ALTER TABLE Warehouse ADD CONSTRAINT managerID 
FOREIGN KEY (managerID) REFERENCES Employee(staffID)
ON UPDATE CASCADE
ON DELETE CASCADE;

当然,随着FK的设置方式(并且除非我能以其他方式做到这一点),我似乎不会因为出错而放任何东西。当前插入代码如下:

USE WareMart_30114465;
INSERT INTO Warehouse (warehouseID, street, city, statesh, postcode)
VALUES ('W01', 'SturtSt', 'Ballarat', 'VIC', '3350' );
INSERT INTO Employee (staffID, surname, firstName, dob, street, city, statesh,       postcode, salary, warehouseID)
VALUES (1, 'Smith', 'John', 01/02/03, 'Example St', 'GenericPlace', 'ABC', '1234', 

我个人不知道为什么我必须设置一个圆圈/鸡蛋参考,因为我认为这违反了惯例。

有什么想法吗?

3 个答案:

答案 0 :(得分:1)

我不知道它是否违反您的规格以及它们是否已修复。但就个人而言,我会添加另一张不同员工职位的表格。例如1 =经理,2 =标准员工等...

然后在Employee表中添加一个名为position或相关的字段。

然后仓库和员工表之间的关系将是单一的,然后在查询中搜索时,您将选择employeeId匹配的员工,位置字段是manager。

很抱歉没有实际的例子。一个例子是:

Select secUser.* from secUser JOIN secUserRole ON secUser.pkUser = secUserRole.fkUser WHERE fkRole = 0

上面的内容获取UserRole表的Role值= 0

的所有用户详细信息

<强>仓库

WarehouseID

<强>员工

雇员

PositionID

<强>位置

PositionID

名称

答案 1 :(得分:0)

只有在插入仓库时才会出现问题,并且由于插入仓库很可能很少发生,因此您可以在执行此操作时关闭外键检查:

SET foreign_key_checks = 0;

并在您完成

后启用它
SET foreign_key_checks = 1;

MySQL引用是here

答案 2 :(得分:0)

在两个表中的一个表中,将记录插入到具有相互FOREIGN KEY依赖关系的表中的“鸡和蛋”难题的传统方法是to allow NULL for a foreign key constrained column

例如,在NOT NULL表的managerID上代替WAREHOUSE,您将定义表以允许此字段中的Null。然后,WAREHOUSE记录可以在与您要分配的INSERT对应的EMPLOYEE记录之前managerID编辑,暂时在其中放置空值。随后,可以使用正确的WAREHOUSE更新managerID记录。

这通常被认为比完全关闭外键检查更好,因为这是一个“全局”设置,并且您不希望假设您的任务是唯一正在运行的任务。