如何在删除查询之前使用级联删除来获取将被删除的所有行

Har*_*ndh 10 mysql sql psql

获取所有行的最佳方法是什么,这些行将在主键级联上删除?

目前我们知道使用主键作为外键的表列表,现在可以使用简单的选择查询

在大型项目中,将来当添加新表并由任何开发人员使用主键创建外键时。他们可能会错过级联删除之前必须完成的业务逻辑。因此,如果自动发现受影响的行,则可以进行相应处理。

我正在寻找 sql 中的一些功能,它表示在我们启动删除查询之前这些行将受到影响。sql引擎以某种方式维护关系的映射以级联删除。

我们能否以某种方式利用级联删除关系来获取选择查询中关系中的所有行。

编辑:

要求是向用户显示在任何时间点哪些行将被删除。

我正在寻找 sql 中的解决方案,以便即使将来进行架构更改,也不需要使用另一种后端语言来实现此用例。

Sal*_*n A 0

我能想到的一个粗略的解决方案是探测 MySQLINFORMATION_SCHEMA以找到相关表的主键,然后找到引用该主键的所有表。下面是一个确定employees数据库表主键的示例查询employees

SELECT K.TABLE_SCHEMA, K.TABLE_NAME, K.COLUMN_NAME
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS K
WHERE EXISTS (
    SELECT 1
    FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS C
    WHERE C.CONSTRAINT_TYPE = 'PRIMARY KEY' 
    AND K.CONSTRAINT_NAME = C.CONSTRAINT_NAME 
    AND K.TABLE_SCHEMA = C.TABLE_SCHEMA 
    AND K.TABLE_NAME = C.TABLE_NAME
    AND C.TABLE_SCHEMA = 'employees' 
    AND C.TABLE_NAME = 'employees' 
);
Run Code Online (Sandbox Code Playgroud)
TABLE_SCHEMA 表名 COLUMN_NAME
雇员 雇员 雇员编号

然后查询查找引用employees数据库、employees表、emp_no列作为外键的所有表:

SELECT K.TABLE_SCHEMA, K.TABLE_NAME, K.COLUMN_NAME
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS K
WHERE EXISTS (
    SELECT 1
    FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS C
    WHERE C.CONSTRAINT_TYPE = 'FOREIGN KEY' 
    AND K.CONSTRAINT_NAME = C.CONSTRAINT_NAME 
    AND K.TABLE_SCHEMA = C.TABLE_SCHEMA 
    AND K.TABLE_NAME = C.TABLE_NAME
)
AND K.REFERENCED_TABLE_SCHEMA = 'employees'
AND K.REFERENCED_TABLE_NAME = 'employees'
AND K.REFERENCED_COLUMN_NAME = 'emp_no'
Run Code Online (Sandbox Code Playgroud)
TABLE_SCHEMA 表名 COLUMN_NAME
雇员 部门员工 雇员编号
雇员 部门经理 雇员编号
雇员 工资 雇员编号
雇员 标题 雇员编号

您现在拥有引用员工表的所有表的列表。根据上述信息,您可以编写一个脚本,为将要删除的员工以及四个相关表中的行创建 select 语句。

不幸的是,信息模式不会告诉您约束是否具有on delete cascade