我是SQL的新手,我不完全确定为什么会收到错误:第5行的错误1824(HY000):无法打开引用表'products' 操作失败,退出代码为1
这是我的代码
drop database if exists cc;
create database cc /*!40100 default character set utf8 */;
use cc;
create table Customers(
CustomerID int not null,
FirstName varchar(255),
LastName varchar(255),
address varchar(255),
phoneNO varchar(11),
prodID int,
quantity int,
primary key (CustomerID),
foreign key (prodID) references Products(itemID)
);
create table Employees(
EmployeeID int not null,
FirstName varchar(255),
LastName varchar(255),
address varchar(255),
phoneNO varchar(11),
ManagerID int not null,
primary key (EmployeeID),
foreign key (managerID) references Managers(mgrID)
);
create table Managers(
mgrID int not null,
salary float,
MaxSupervisingCapacity int,
foreign key (mgrID) references Employees(EmployeeID),
primary key (mgrID)
);
答案 0 :(得分:2)
在创建另一个表之前,您不能创建引用另一个表的外键。在Customers
表中
foreign key (prodID) references Products(itemID)
,但是还没有Products
表。在Employees
中,您有
foreign key (managerID) references Managers(mgrID)
但在其后创建Managers
表。
您需要重新排序表的创建。在Products
之前创建Customers
。
此外,您不能具有循环外键关系。 Employees.managerID
个引用Managers
和Managers.mgrID
引用Employees
。这就产生了一个鸡与蛋的问题:您将如何创建第一个员工,因为它需要一个经理,但是您不能创建第一个经理,因为它需要引用一个员工。
您可以通过允许外键为空来解决此问题。因此,您需要使用空经理创建第一个员工,然后创建经理,然后使用该ID替换managerID
。
在创建这两个表时,还有一个鸡与蛋的问题。您无法引用尚未创建的表。因此,在创建表时省去foreign key
规范,以后再用ALTER TABLE
添加它。
create table Employees(
EmployeeID int not null,
FirstName varchar(255),
LastName varchar(255),
address varchar(255),
phoneNO varchar(11),
ManagerID int not null,
primary key (EmployeeID)
);
create table Managers(
mgrID int not null,
salary float,
MaxSupervisingCapacity int,
foreign key (mgrID) references Employees(EmployeeID),
primary key (mgrID)
);
alter table Employees add foreign key (managerID) references Managers(mgrID);
答案 1 :(得分:0)
您可以将整个内容用
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS;
SET FOREIGN_KEY_CHECKS=0;
## all of your schema and inserts
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
此检查更改将导致引擎不对这些键进行检查,而只是按原样添加它们。