Таблица MySQL с двумя родителями - при удалении строки удаление не происходит каскадно - Google Cloud SQL - PullRequest
0 голосов
/ 09 июля 2019

У меня довольно простая схема SQL, которая испытывает проблемы с каскадным удалением.

В основном я хочу иметь:

  • Users таблица с электронной почтой
  • Items таблица w /
    • text
    • createdByUser внешний ключ (родительский номер 1)
    • необязательный parent внешний ключ элемента (родительский номер #2)

У элементов есть два родителя - пользователь и, возможно, другой элемент (поэтому они могут быть иерархическими). ​​

Моя проблема связана с каскадным удалениемItems, когда я удаляю User.Если я удаляю пользователя, который создал элементы, то я ожидаю, что все эти элементы будут удалены.Тем не менее, элементы, имеющие parentItem, также НЕ удаляются, и вместо этого parentItem был просто установлен на NULL.

В MySQL 5.6 (на sqlfiddle.com) это работает нормально,Но в MySQL 5.7 (в Google Cloud) проблема заключается в том, что элемент "DA" ниже не удаляется.

Вот команды схемы и вставки:

SET FOREIGN_KEY_CHECKS = 0;
DROP TABLE IF EXISTS Users;
DROP TABLE IF EXISTS Items;
SET FOREIGN_KEY_CHECKS = 1;

CREATE TABLE Users (
  id INT NOT NULL AUTO_INCREMENT,
  email VARCHAR(191) NOT NULL UNIQUE,

  PRIMARY KEY (id)
) ENGINE=INNODB DEFAULT CHARSET=utf8mb4;

CREATE TABLE Items (
  id INT NOT NULL AUTO_INCREMENT,

  parentItem INT DEFAULT NULL,
  text TEXT NOT NULL,
  createdByUser INT NOT NULL,

  PRIMARY KEY (id),
  INDEX (createdByUser),
  INDEX (parentItem),

  FOREIGN KEY (createdByUser)
    REFERENCES Users (id)
    ON DELETE CASCADE,
  FOREIGN KEY (parentItem)
    REFERENCES Items (id)
    ON DELETE SET NULL
) ENGINE=INNODB DEFAULT CHARSET=utf8mb4;

INSERT INTO Users (email) VALUES
  ("test@email.com")
  ;

SET @temp_user_id = (select id from Users where email="test@email.com" LIMIT 1);

INSERT INTO Items (text, createdByUser) VALUES
  ("A", @temp_user_id),
  ("B", @temp_user_id),
  ("C", @temp_user_id),
  ("D", @temp_user_id)
  ;

SET @temp_item_id = (select id from Items where text = "D" LIMIT 1);

INSERT INTO Items (parentItem, text, createdByUser) VALUES
  (@temp_item_id, "DA", @temp_user_id)
  ;

DELETE From Users where id = @temp_user_id;

SELECT * FROM Users;
SELECT * From Items;

Я ожидаювывод должен быть пустым для обеих таблиц.Но в MySQL 5.7 в Google Cloud у Предметов по-прежнему есть 1 строка, "DA":

+----+------------+------+---------------+
| id | parentItem | text | createdByUser |
+----+------------+------+---------------+
|  5 |       NULL | DA   |             1 |
+----+------------+------+---------------+

Что я здесь не так делаю?

Для справки, вот что говорит Google MySQL MySQLмне про столы:

| Users | CREATE TABLE `Users` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `email` varchar(191) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `email` (`email`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 |
| Items | CREATE TABLE `Items` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `parentItem` int(11) DEFAULT NULL,
  `text` text NOT NULL,
  `createdByUser` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `createdByUser` (`createdByUser`),
  KEY `parentItem` (`parentItem`),
  CONSTRAINT `Items_ibfk_1` FOREIGN KEY (`createdByUser`) REFERENCES `Users` (`id`) ON DELETE CASCADE,
  CONSTRAINT `Items_ibfk_2` FOREIGN KEY (`parentItem`) REFERENCES `Items` (`id`) ON DELETE SET NULL
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 |

1 Ответ

1 голос
/ 10 июля 2019

Я установил старый 5.7.14 с официального сайта MySQL, чтобы воспроизвести ваш сценарий, и получил тот же результат. Я пытался с 5.6.42 и 5.7.26 (последний), и таблица пуста. Похоже, это внутренняя ошибка MySQL. В вашей ситуации вы можете использовать Google Cloud MySQL 5.6 версии.

...