Mysql 尝试将值插入到包含相互引用的外键的表中
因此,我试图根据规范表(给出了ER图和DB模式)创建一个数据库,该表指定前两个表包含相互引用,如下所示: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
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文件都是必需的),我认为我可以以任何方式使用它。谢谢:)我会检查我是否可以改变结构,因为我有一个与您类似的想法,创建“代理表”,这两个前面提到的表都可以读取,但在我知道我可以之前,我不会实现类似的任何操作:)