使用 CASCADE 删除行时显示警告
Posted
技术标签:
【中文标题】使用 CASCADE 删除行时显示警告【英文标题】:Show warning when deleting rows with CASCADE deletes 【发布时间】:2021-07-26 18:34:03 【问题描述】:在删除 CASCADE 删除的行时,是否有任何选项(甚至是 DB 客户端)需要确认。例如:
从 id=1 的目录中删除
警告:这还将删除 CASCADE 92,358 个产品和 142 个目录历史记录。你确定吗? (如果有,暂时开启 ALLOW_CASCADE_DELETES 或者添加 WITH CASCADE 到查询中)
我更喜欢不需要遵循 db 架构中的特定规则并与 mysql 一起使用的解决方案。 (或者,如果有一种方法可以强制 FK 删除,同时一般将 CASCADE 保留在模式之外,那么这也是一个不错的选择。)
【问题讨论】:
DBMS 是关于数据处理的,它没有用户交互。所有用户交互都应出现在应用程序级别,并带有警告消息、确认等。 如果您想达到您的要求:1. 首先获取记录/计数,显示在屏幕上以供用户接受,然后点击确定 - 删除记录。 @astentx MySQL 可以支持一个选项以在需要时支持便利性并在默认情况下降低风险,这是完全合理的。我怀疑这是不可能的,但希望......数据处理工具友好是可以的。 @EdwinEvans 也许吧,但是 DBMS 是一个后端,所以它不应该允许业务用户直接在数据库内部进行一些修改(尽管 SQL 是作为“用户友好的”开发的)。并且由于您的用户可以直接在数据库中删除某些内容,因此他们应该具有很高的特权。这反过来又假设这样的用户不是好奇的路人,而是有明智意图的人。听起来很合理,但 IDE 本身并不是 SQL 引擎,因此没有提供警告的媒介:事务应该成功完成还是应该失败,没有中间状态。 【参考方案1】:你不能在 mysql 中这样做
我试了一下https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=b6575f084b486025a66f6d52a4df9893
但在开始删除行之前,必须启用外键恢复,如示例中所示
所以你必须运行两个代码,一个是SET FOREIGN_KEY_CHECKS
CREATE TABLE catalogs(id int PRIMARY KEY); INSERT INTO catalogs VALUES (1),(2);
CREATE TABLE catalogs_sub(id int, cat_id int, FOREIGN KEY (cat_id) REFERENCES catalogs( id) ON DELETE CASCADE )
INSERT INTO catalogs_sub VALUES (1,1),(2,1),(3,2),(4,2)
编号 | cat_id -: | -----: 1 | 1 2 | 1 3 | 2 4 | 2SELECT * FROM catalogs_sub
SET FOREIGN_KEY_CHECKS=0; DELETE FROM catalogs WHERE id=1; SET FOREIGN_KEY_CHECKS=1;
|编号 | | -: | | 2 |SELECT * FROM catalogs
编号 | cat_id -: | -----: 1 | 1 2 | 1 3 | 2 4 | 2SELECT * FROM catalogs_sub
DELETE FROM catalogs WHERE id=2;
|编号 | | -: |SELECT * FROM catalogs
编号 | cat_id -: | -----: 1 | 1 2 | 1SELECT * FROM catalogs_sub
db小提琴here
【讨论】:
以上是关于使用 CASCADE 删除行时显示警告的主要内容,如果未能解决你的问题,请参考以下文章
Postgres 复合类型 drop cascade 仅删除依赖列
ORACLE中Drop table cascade constraints
如何在一对一关系中使用 onDelete: 'CASCADE'