使用 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)
SELECT * FROM catalogs_sub
编号 | cat_id -: | -----: 1 | 1 2 | 1 3 | 2 4 | 2
SET FOREIGN_KEY_CHECKS=0;
DELETE FROM catalogs WHERE id=1;
SET FOREIGN_KEY_CHECKS=1;
SELECT * FROM catalogs
|编号 | | -: | | 2 |
SELECT * FROM catalogs_sub
编号 | cat_id -: | -----: 1 | 1 2 | 1 3 | 2 4 | 2
DELETE FROM catalogs WHERE id=2;
SELECT * FROM catalogs
|编号 | | -: |
SELECT * FROM catalogs_sub
编号 | cat_id -: | -----: 1 | 1 2 | 1

db小提琴here

【讨论】:

以上是关于使用 CASCADE 删除行时显示警告的主要内容,如果未能解决你的问题,请参考以下文章

删除 ON DELETE CASCADE

Postgres 复合类型 drop cascade 仅删除依赖列

ORACLE中Drop table cascade constraints

如何在一对一关系中使用 onDelete: 'CASCADE'

级联=“删除” VS orphanRemoval=true VS ondelete="CASCADE

Laravel 迁移:从现有外键中删除 onDelete('cascade')