Почему мое MySQL каскадное удаление не работает? - PullRequest
1 голос
/ 10 марта 2020

У меня есть три таблицы: Employee, Dependent и DependsOn. По какой-то причине на моем сервере код MySQL неправильно выполняет каскадное удаление. Я вставляю Сотрудника, Зависимого, затем связываю их в DependsOn. Если я удаляю Employee, он должен удалить соответствующую строку в DependsOn. Однако, это не так. Если я запускаю запрос в SQLFiddle.com, он работает нормально. Почему это не работает?

CREATE TABLE Employee 
( 
  SSN int(9) not null unique, 
  First_Name varchar(16) default null, 
  Middle_Initial char(1) default null, 
  Last_Name varchar(16) default null, 
  Address varchar(64) default null, 
  Phone_Number char(10) default null, 

  PRIMARY KEY(SSN) 
);

CREATE TABLE Dependent
(
  Dependent_Name varchar(32) NOT NULL,
  Dependent_Relationship varchar(32) NOT NULL,

  KEY(Dependent_Name),
  KEY(Dependent_Relationship)
);

CREATE TABLE DependsOn
(
  E_SSN int(9) NOT NULL UNIQUE,
  D_Name varchar(32) NOT NULL,
  D_Relationship varchar(32) NOT NULL,

  FOREIGN KEY(E_SSN) REFERENCES Employee(SSN) ON DELETE CASCADE ON UPDATE CASCADE,
  FOREIGN KEY(D_Name) REFERENCES Dependent(Dependent_Name) ON DELETE CASCADE ON UPDATE CASCADE,
  FOREIGN KEY(D_Relationship) REFERENCES Dependent(Dependent_Relationship) ON DELETE CASCADE ON UPDATE CASCADE
);

INSERT INTO Employee VALUES(111223333, "John", "A", "Doe", NULL, NULL);
INSERT INTO Dependent VALUES("Albert A Doe", "Son");
INSERT INTO DependsOn(111223333, "Albert A Doe", "Son");

1 Ответ

0 голосов
/ 10 марта 2020

Механизм хранения MyISAM разрешает определения ограничений FOREIGN KEY в операторах CREATE, но игнорирует их. Изменение механизма таблиц на тот, который поддерживает такие ограничения, такие как InnoDB, после того, как таблица уже была создана, задним числом не добавляет ограничений. Таблицу необходимо либо удалить, либо заново создать, либо для сохранения данных можно добавить сами ограничения.

...