Код ошибки MySQL 1215: «Невозможно добавить ограничение внешнего ключа» - PullRequest
0 голосов
/ 22 апреля 2019

Я получаю эту ошибку при попытке создать таблицу с SQL.

У меня есть две таблицы:

Я использую PHPMyAdmin, и он не позволит мне использовать M_id в качестве внешнего ключа, который ссылается на первичный ключ таблицы сотрудников E_id.

Кто-нибудь может увидеть, что не так с моим кодом?

Спасибо!

Ответы [ 3 ]

2 голосов
/ 22 апреля 2019

Определения внешнего ключа должны точно соответствовать столбцам первичного ключа, к которым они относятся. В этом случае вы определили 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
)
0 голосов
/ 22 апреля 2019

Я не буду подвергать сомнению ваш дизайн, хотя он выглядит проблематичным.

Однако - вы не можете ссылаться на таблицу, которая еще не существует (REFERENCES Department(D_id)).Вы должны либо удалить ограничения FOREIGN KEY из операторов CREATE, а затем добавить их в инструкции 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
;

Демо

Или временно отключить проверку внешнего ключа:

SET FOREIGN_KEY_CHECKS = 0;

CREATE TABLE EMPLOYEE (...);

CREATE TABLE Department (...);

SET FOREIGN_KEY_CHECKS = 1;

Демо

Вы также не можете использовать ON DELETE SET DEFAULT.InnoDB не поддерживает это.Вам нужно изменить его на ON DELETE SET NULL.Если вам нужно такое поведение, вам нужно будет реализовать его либо в коде приложения, либо в триггере.

Я бы также использовал TEXT в качестве типа данных вместо VARCHAR(30000).

0 голосов
/ 22 апреля 2019

Ваш код содержит несколько ошибок:

  • 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".
  • Внешние ключи и первичные ключи имеют одинаковые имена.
  • Первичный ключ - это первый столбец в таблице.

Здесь - скрипта db <>, показывающая, что это работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...