mysql 中具有多个模式的更新软删除

soft delete on update in mysql with multiple schemas

我现在的情况是:

背景

  1. 我有 2 个数据库模式,名为 "prod" 和 "stg"。
  2. "prod" 包含 2 个 table 称为 "parent" 和 "child"
  3. "stg"只有"parent"table
  4. "parent" table 定义在 "prod" 和 "stg" 模式中是相同的。
  5. 在删除记录的情况下,"parent" table定义为软删除(逻辑删除,即设置delete_flg为“1”),而"child" table为true delete(物理删除记录)

目标

我正在努力实现以下目标: 当且仅当 "prod"."parent" 和 "stg"."parent" 都被删除时(无论是物理上还是逻辑上,或者在一侧不存在)然后自动级联删除对 "prod"."child" table 中的记录进行操作(物理删除),其 "SP_ID" 与 "parent".

中的值匹配

例如,假设我有

"prod"."parent"
+----+---------+--------+
| SP_ID | SP_NAME | DELETE_FLG |
+----+---------+--------+
|  1 |       1 |      1 |
+----+---------+--------+



"prod"."parent"
+----+---------+--------+
| SP_ID | SP_NAME | DELETE_FLG |
+----+---------+--------+
|  1 |       1 |      1 |
+----+---------+--------+

"stg"."parent"
+----+---------+--------+
| SP_ID | SP_NAME | DELETE_FLG |
+----+---------+--------+
|  1 |       1 |      0 |
+----+---------+--------+


"prod"."child"
+----+---------+
| SP_ID | JOB_KEY |
+----+---------+
|  1 |       key |
+----+---------+

,如果我执行 sql 更新 "stg"."parent" set DELETE_FLG = 1 where SP_ID = 1,逻辑上删除最后一个 "existing" "parent" table 中有 SP_ID 1 的记录,那么 "prod"."child" 中的记录也会被 [=85 自动物理删除=].

问题

我一直在考虑将子 table 中的 SP_ID 作为外键引用父中的外键 (https://dev.mysql.com/doc/refman/8.0/en/create-table-foreign-keys.html) 然而, a) 我不知道是否可以在不同的模式中引用多个 table,并且 b) 似乎 mysql 只支持级联相同的操作,即删除父级然后删除子级或更新父级然后更新子级。但就我而言,我想更新父项然后删除子项。

有人可以帮我吗? mysql有可能实现吗?或者我必须在应用层做这个?

Table定义

CREATE TABLE `prod`.`parent` (
  `SP_ID` varchar(20) NOT NULL COMMENT '',
  `SP_NAME` varchar(100) NOT NULL COMMENT '',
  `DELETE_FLG` tinyint(1) NOT NULL DEFAULT '0' COMMENT '',
  PRIMARY KEY (`SP_ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT=''


CREATE TABLE `prod`.`child` (
  `SP_ID` varchar(20) NOT NULL COMMENT '',
  `JOB_KEY` varchar(11) NOT NULL,
  PRIMARY KEY (`SP_ID`,`JOB_KEY`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT=''



CREATE TABLE `stg`.`parent` (
  `SP_ID` varchar(20) NOT NULL COMMENT '',
  `SP_NAME` varchar(100) NOT NULL COMMENT '',
  `DELETE_FLG` tinyint(1) NOT NULL DEFAULT '0' COMMENT '',
  PRIMARY KEY (`SP_ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT=''

提示使用触发器,这是我的有效解决方案: 向 prod 和 stg 父表添加 2 个触发器(一个在更新后,on 在删除后)。

# after update trigger
CREATE DEFINER=`root`@`localhost` TRIGGER `stg`.`parent_AFTER_UPDATE` AFTER UPDATE ON `parent` FOR EACH ROW
BEGIN
IF (
select
count(*)
from(
select 
*
from `prod`.`parent`
where `prod`.`parent`.id = old.id and `prod`.`parent`.delete_flg = 0
Union all
select 
*
from `stg`.`parent`
where `stg`.`parent`.id = old.id and `stg`.`parent`.delete_flg = 0
) as a
) = 0 THEN 
DELETE FROM `prod`.`child` WHERE `prod`.`child`.id = old.id;
END IF;
END



# after delete trigger
CREATE DEFINER=`root`@`localhost` TRIGGER `stg`.`parent_AFTER_DELETE` AFTER DELETE ON `parent` FOR EACH ROW
BEGIN
IF (
select
count(*)
from(
select 
*
from `prod`.`parent`
where `prod`.`parent`.id = old.id and `prod`.`parent`.delete_flg = 0
Union all
select 
*
from `stg`.`parent`
where `stg`.`parent`.id = old.id and `stg`.`parent`.delete_flg = 0
) as a
) = 0 THEN 
DELETE FROM `prod`.`child` WHERE `prod`.`child`.id = old.id;
END IF;
END