具有两个父级的MySQL表-行删除期间,删除不会级联-Google Cloud SQL

具有两个父级的MySQL表-行删除期间,删除不会级联-Google Cloud SQL,mysql,sql,google-cloud-sql,mysql-5.7,mysql-5.6,Mysql,Sql,Google Cloud Sql,Mysql 5.7,Mysql 5.6,我有一个非常简单的SQL模式,它在级联删除时遇到问题 基本上我想要: 带电子邮件的用户表 项目表w/ 文本 createdByUser外键父级1 可选父项外键父项2 项有两个父项-一个用户,还可以选择另一个项,因此它们可以分层 当我删除一个用户时,我的问题来自于项目的级联删除。如果我删除了创建项目的用户,那么我希望删除所有这些项目。但是,也不会删除具有parentItem的项目,而是将parentItem设置为NULL 在MySQL 5.6上,在sqlfiddle.com上,这似乎可以正常工作。

我有一个非常简单的SQL模式,它在级联删除时遇到问题

基本上我想要:

带电子邮件的用户表 项目表w/ 文本 createdByUser外键父级1 可选父项外键父项2 项有两个父项-一个用户,还可以选择另一个项,因此它们可以分层

当我删除一个用户时,我的问题来自于项目的级联删除。如果我删除了创建项目的用户,那么我希望删除所有这些项目。但是,也不会删除具有parentItem的项目,而是将parentItem设置为NULL

在MySQL 5.6上,在sqlfiddle.com上,这似乎可以正常工作。但是在谷歌云上的MySQL5.7上,这有一个问题,下面的DA项没有被删除

以下是架构和插入命令:

设置外键检查=0; 如果存在用户,则删除表; 如果存在项目,则删除表; 设置外键检查=1; 创建表用户 id INT非空自动增量, 电子邮件VARCHAR191非空唯一, 主键id ENGINE=INNODB默认字符集=utf8mb4; 创建表项 id INT非空自动增量, parentItem INT默认为空, 文本不为空, createdByUser INT不为空, 主键id, 索引createdByUser, 索引父项, 外键createdByUser 引用用户id 在删除级联时, 外键父项 参考项目id 关于删除集NULL ENGINE=INNODB默认字符集=utf8mb4; 向用户插入电子邮件值 test@email.com ; SET@temp\u user\u id=从发送电子邮件的用户中选择id=test@email.com限值1; 插入到项目文本中,创建DbyUser值 A、 @temp_user_id, B、 @temp_user_id, C、 @temp_user_id, D、 @temp\u user\u id ; 设置@temp_item_id=从text=D LIMIT 1的项目中选择id; 插入项目parentItem、text、createdByUser值 @临时项目id,DA,@temp用户id ; 从id=@temp\u user\u id的用户中删除; 从用户中选择*; 从项目中选择*; 我希望两个表的输出都是空的。但在谷歌云上的MySQL 5.7中,Items仍然有一行,DA:

+--+------+---+--------+ |id | parentItem | text | createdByUser| +--+------+---+--------+ |5 |空|达| 1| +--+------+---+--------+ 我做错了什么

以下是Google的MySQL告诉我的关于这些表的信息,仅供参考:

|用户|创建表“用户” `id`int11非空自动增量, `电子邮件'varchar191不为空, 主键'id`, 唯一键'email``email` ENGINE=InnoDB AUTO_INCREMENT=2默认字符集=utf8mb4| |Items|创建表'Items` `id`int11非空自动增量, `parentItem`int11默认为空, `text`文本不为空, `createdByUser`int11不为空, 主键'id`, 键`createdByUser``createdByUser`, 键`parentItem``parentItem`, 约束`Items\u ibfk\u 1`FOREIGN KEY`createdByUser`REFERENCES`Users``id`ON DELETE CASCADE, 删除集NULL上的约束`Items\u ibfk\u 2`外键`parentItem`引用`Items``id` 引擎=InnoDB自动增量=6默认字符集=utf8mb4|
我从MySQL官方网站安装了旧的5.7.14来复制您的场景,并收到了相同的结果。我试过了5.6.42和5.7.26这两个最新的版本,但表是空的。看起来这是MySQL的内部错误。在您的情况下,您可以使用Google Cloud MySQL 5.6版本。

Hm。它在我的MySQL 5.7.23和MariaDB 10.1.14上运行良好。我的意思是删除用户后表项是空的。这很令人沮丧-我不知道谷歌数据库的子版本-也许他们知道这里的问题怪癖?我想我在这里存储分层数据的方式也做得不太好,也许我应该放弃parentItem,做一个闭包表?Google Cloud有两个版本的Cloud MySQL 5.7.14和MySQL 5.6.42。我查看了5.6,一切正常。感谢您的调查!我发现了一个MySQL错误,这太疯狂了——我想我不应该使用键约束,而应该使用事务:/