mysql 中具有多个模式的更新软删除
soft delete on update in mysql with multiple schemas
我现在的情况是:
背景
- 我有 2 个数据库模式,名为 "prod" 和 "stg"。
- "prod" 包含 2 个 table 称为 "parent" 和 "child"
- "stg"只有"parent"table
- "parent" table 定义在 "prod" 和 "stg" 模式中是相同的。
- 在删除记录的情况下,"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
我现在的情况是:
背景
- 我有 2 个数据库模式,名为 "prod" 和 "stg"。
- "prod" 包含 2 个 table 称为 "parent" 和 "child"
- "stg"只有"parent"table
- "parent" table 定义在 "prod" 和 "stg" 模式中是相同的。
- 在删除记录的情况下,"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