Mysql 尝试将值插入到包含相互引用的外键的表中

Mysql 尝试将值插入到包含相互引用的外键的表中,mysql,reference,insert,foreign-keys,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

因此,我试图根据规范表(给出了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创建代码如下*我在创建表后将最后一列添加到“Warehouse”中,因为两个表中都包含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的设置方式是这样的(而且必须是这样,除非atm我能以其他方式进行设置),我似乎无法在没有出错的情况下进行任何操作。当前插入代码如下:

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', 
我个人不知道为什么我必须建立一个圆圈/鸡蛋参考,因为我认为这是违反惯例的


有什么想法吗?

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

SET foreign_key_checks = 0;
完成后启用它

SET foreign_key_checks = 1;

MySQL引用是

我不知道它是否违反了您的规范,是否已修复。但就我个人而言,我会添加另一个包含不同员工职位的表。e、 g 1=经理,2=标准员工等

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

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

对不起,没有工作的例子。例如:

Select secUser.* from secUser JOIN secUserRole ON secUser.pkUser = secUserRole.fkUser WHERE fkRole = 0
其中,上述内容获取UserRole表的Role值为0的所有用户详细信息

仓库

仓库管理员

等等

员工

雇员ID

位置ID

等等

位置

位置ID

名字


等。

解决“鸡和蛋”困境的传统方法是将记录插入到具有相互
外键
依赖关系的表中,这两个表中的一个

例如,您可以在
WAREHOUSE
表的
managerID
上定义该表以允许该字段为空,而不是
notnull
。然后,可以将
仓库
记录插入到与要分配的
managerID
对应的
员工
记录之前,暂时将空值放在那里。随后,可以使用正确的
managerID
更新
仓库
记录


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

谢谢,到目前为止,这对我是有效的,使用它插入仓库:
使用WareMart_3014465;设置外键检查=0;在仓库(仓库ID、街道、城市、州、邮政编码)中插入值(“W01”、“SturtSt”、“Ballarat”、“VIC”、“3350”)但是,我在员工中插入以下内容时出错:
插入员工(职员、姓氏、名字、出生日期、街道、城市、州、邮政编码、工资、仓库ID、监管人)值(1,‘史密斯’、‘约翰’、01/02/03、‘示例街’、‘通用广场’、‘ABC’、‘1234’、‘654’)我可以理解为什么禁用FK检查可能被认为是使用较少的选项,但是考虑到所创建的DB im的简单性(create.sql、populate.sql和query.sql文件都是必需的),我认为我可以以任何方式使用它。谢谢:)我会检查我是否可以改变结构,因为我有一个与您类似的想法,创建“代理表”,这两个前面提到的表都可以读取,但在我知道我可以之前,我不会实现类似的任何操作:)