所以我试图根据规格表创建一个数据库(给出了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',
我个人不知道为什么我必须设置一个圆圈/鸡蛋参考,因为我认为这违反了惯例。
有什么想法吗?
答案 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
记录。
这通常被认为比完全关闭外键检查更好,因为这是一个“全局”设置,并且您不希望假设您的任务是唯一正在运行的任务。