无法打开引用表

时间:2018-09-18 00:51:56

标签: mysql sql

我是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) 
);

2 个答案:

答案 0 :(得分:2)

在创建另一个表之前,您不能创建引用另一个表的外键。在Customers表中

foreign key (prodID) references Products(itemID)

,但是还没有Products表。在Employees中,您有

foreign key (managerID) references Managers(mgrID)

但在其后创建Managers表。

您需要重新排序表的创建。在Products之前创建Customers

此外,您不能具有循环外键关系。 Employees.managerID个引用ManagersManagers.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;

此检查更改将导致引擎不对这些键进行检查,而只是按原样添加它们。