【问题标题】:Show warning when deleting rows with CASCADE deletes使用 CASCADE 删除行时显示警告
【发布时间】: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 引擎,因此没有提供警告的媒介:事务应该成功完成还是应该失败,没有中间状态。

标签: mysql sql datagrip


【解决方案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

【讨论】:

    猜你喜欢
    • 2019-12-17
    • 1970-01-01
    • 2012-12-09
    • 2015-08-11
    • 2015-05-20
    • 1970-01-01
    • 2012-05-05
    • 1970-01-01
    • 2011-11-30
    相关资源
    最近更新 更多