MySQL错误代码1215:“无法添加外键约束”

时间:2019-04-22 10:22:42

标签: mysql sql phpmyadmin

尝试使用SQL创建表时,我总是收到此错误。

我有这两个表:

我正在使用PHPMyAdmin,并且不允许我使用M_id作为引用Employee Table主键E_id的外键。

任何人都可以看到我的代码有什么问题吗?

谢谢!

3 个答案:

答案 0 :(得分:2)

外键定义必须与它们所引用的主键列完全匹配。在这种情况下,您将Department.M_id定义为可为空的整数列,而EMPLOYEE.E_id为不可为整数的整数。尝试使M_id不可为空:

CREATE TABLE Department (
    D_name VARCHAR(100) NOT NULL,
    D_id INT NOT NULL,
    M_id INT NOT NULL DEFAULT 0000,
    ...
    FOREIGN KEY (M_id) REFERENCES EMPLOYEE(E_id)
    ON DELETE SET DEFAULT   ON UPDATE CASCADE
)

答案 1 :(得分:0)

您的代码有多个错误:

  • varchar()的长度太长。
  • 您具有外键约束的前向参考。
  • SET DEFAULT确实无效。

您想要这样的东西:

CREATE TABLE employees (
  employee_id int not null primary key,
  Job_type VARCHAR(100),
  Ssn INT NOT NULL,
  Salary DECIMAL NOT NULL,
  Address VARCHAR(500) NOT NULL,
  First_name VARCHAR(50) NOT NULL,
  M_initial CHAR(1),
  Last_name VARCHAR(50) NOT NULL,
  E_end_date DATE,
  E_start_date DATE NOT NULL,
  department_id INT NOT NULL,
  Super_id INT,
  FOREIGN KEY (Super_id) REFERENCES employees(employee_id) ON DELETE SET NULL ON UPDATE CASCADE,
  UNIQUE (Ssn)
);

CREATE TABLE departments (
  department_id int primary key,
  D_name VARCHAR(100) NOT NULL,
  D_id INT NOT NULL,
  M_id INT DEFAULT 0000,
  Manager_start_date DATE NOT NULL,
  Manager_end_date DATE,
  Report VARCHAR(8000),
  Num_of_employees INT NOT NULL,
  FOREIGN KEY (M_id) REFERENCES employees(employee_id) ON DELETE SET NULL ON UPDATE CASCADE,
  UNIQUE (D_name)
);

ALTER TABLE employees ADD CONSTRAINT FOREIGN KEY (department_id) REFERENCES departments(department_id)
  ON DELETE CASCADE ON UPDATE CASCADE;

我还更改了一些其他内容:

  • 表名是复数。
  • 主键为单数形式,后跟“ _id”。
  • 外键和主键具有相同的名称。
  • 主键是表中的第一列。

Here是db <>小提琴,表明它可以正常工作。

答案 2 :(得分:0)

尽管看起来有问题,但我不会质疑您的设计。

但是-您无法引用尚不存在的表(REFERENCES Department(D_id))。您应该从CREATE语句中删除FOREIGN KEY约束,然后在ALTER TABLE语句中添加它们。

示例:

CREATE TABLE EMPLOYEE (...);
CREATE TABLE Department (...);

ALTER TABLE EMPLOYEE 
  ADD FOREIGN KEY (D_id)
  REFERENCES Department(D_id)
  ON DELETE CASCADE
  ON UPDATE CASCADE
;

Demo

或暂时禁用外键检查:

SET FOREIGN_KEY_CHECKS = 0;

CREATE TABLE EMPLOYEE (...);

CREATE TABLE Department (...);

SET FOREIGN_KEY_CHECKS = 1;

Demo

您也不能使用ON DELETE SET DEFAULT。 InnoDB不支持它。您需要将其更改为ON DELETE SET NULL。如果需要这种行为,则需要在应用程序代码或触发器中实现它。

我也将TEXT用作数据类型,而不是VARCHAR(30000)