每当我尝试将外键约束设置为“NO ACTION”时,MySQL 工作台会自动将其设置为“RESTRICT”

Posted

技术标签:

【中文标题】每当我尝试将外键约束设置为“NO ACTION”时,MySQL 工作台会自动将其设置为“RESTRICT”【英文标题】:Whenever I try to set foreign key constraint to "NO ACTION" MySQL workbench automatically sets it to "RESTRICT" 【发布时间】:2021-09-03 15:19:32 【问题描述】:

我正在尝试将外键设置为删除和更新到“NO ACTION”的约束,但由于某种原因,在我应用更改后,mysql 工作台将其自行更改回“受限”,我没有不知道为什么会这样。

这是 MySQL Workbench 在我尝试将更新和删除的约束更改为“NO ACTION”时生成的代码

ALTER TABLE `forums`.`post_replies` 
DROP FOREIGN KEY `fk_post_replies_users`;
ALTER TABLE `forums`.`post_replies` 
ADD CONSTRAINT `fk_post_replies_users`
  FOREIGN KEY (`user_id`)
  REFERENCES `forums`.`users` (`id`)
  ON DELETE NO ACTION
  ON UPDATE NO ACTION;

【问题讨论】:

【参考方案1】:

NO ACTIONRESTRICT 是同义词。

"13.1.20.5 FOREIGN KEY Constraints":

NO ACTION:标准 SQL 中的关键字。在 MySQL 中,相当于RESTRICT

Workbench 似乎只是选择显示 RESTRICT 而不是 NO ACTION(好吧,它必须选择一个并选择 MySQL 特定的一个......)。但这并不意味着什么不同。

【讨论】:

如果我想让它在父行被删除时什么都不做怎么办?例如,如果用户希望删除他们的帐户,我不希望删除他们的所有帖子 @InfinityVive:必须做一些事情,否则会有不一致的数据。一个选项是ON DELETE SET NULL,它会“断开”用户的帖子,以便可以删除用户。或者考虑只是“软”删除用户。即不是真的DELETE 它而是UPDATE 一些指示用户不再活动的标志。在仅适用于活动用户的查询中过滤该标志。 " 当父行被删除时什么都不做" 那么你就没有外键。不要一开始就声明。 @sticky bit 的“软”删除很好。

以上是关于每当我尝试将外键约束设置为“NO ACTION”时,MySQL 工作台会自动将其设置为“RESTRICT”的主要内容,如果未能解决你的问题,请参考以下文章

实体 Remove() 将外键属性设置为 null

无法将外键约束添加到数据透视表

首次使用实体框架代码时将外键设置为 null

使用 Visual Studio 数据库项目中的数据将外键约束添加到现有表

删除实体时休眠将外键设置为空

无法将外键约束添加到表