MySQL table 有两个 parents - 在行删除期间,删除不会级联 - Google 云 SQL

MySQL table with two parents - during row deletion, the delete doesn't cascade - Google Cloud SQL

我有一个非常简单的 SQL 模式,但在级联删除方面遇到问题。

基本上我想要:

项目有两个 parents - 一个用户,以及可选的另一个项目(因此它们可以是分层的)。

我的问题是在删除 User 时级联删除 Items。如果我删除了创建项目的用户,那么我希望所有这些项目都被删除。但是,也不会删除具有 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;

我希望两个 table 的输出都是空的。但是在 MySQL 5.7 on Google Cloud 中,项目仍然有 1 行,"DA":

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

我做错了什么?

作为参考,以下是 Google 的 MySQL 告诉我关于 table 的内容:

| 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 |

我从官方 MySQL 站点安装了旧的 5.7.14 以重现您的场景并收到相同的结果。我尝试使用 5.6.42 和 5.7.26(最新的)并且 table 是空的。这似乎是 MySQL 内部错误。在您的情况下,您可以使用 Google Cloud MySQL 5.6 版本。