我需要删除表中的行,例如
DELETE FROM TABLE_X WHERE COL_A = 0
但我不想删除任何可能违反约束的行,我需要知道哪些行有这种违反......
我知道我可以与关系表进行连接,但我想知道是否存在任何通用方法来知道删除时哪些行会违反约束。
我需要删除表中的行,例如
DELETE FROM TABLE_X WHERE COL_A = 0
但我不想删除任何可能违反约束的行,我需要知道哪些行有这种违反......
我知道我可以与关系表进行连接,但我想知道是否存在任何通用方法来知道删除时哪些行会违反约束。
假设您使用 JDBC,有一个名为 GetExportedKeys() 的元数据函数
使用它,您首先获得外键约束。使用该信息,您可以构建一个 Join 语句来捕获违规行为。您运行该语句以获取违反约束的实际行。
这样的事情可能会帮助你:
/* 表 X 是子表 表 Y 是父表 */
DELETE FROM TABLE_X where Y_ID not in (SELECT Y_ID FROM TABLE_Y)
没有通用的方法。您需要使用连接(或在运行时从通用但非内置的元数据生成连接)。
您可以检查系统表、解析约束并使用它们动态构建 JOIN。这并不容易。
另一种方法是逐个删除行(SELECT
所有 ID,然后使用其主键值删除每一行)。失败的DELETE
操作是删除带有约束的行。
在事务中执行此操作并在最后回滚,因此您实际上不会删除这些行。
顺便说一句,我不推荐这种做法,它很奇怪而且效率低下。但它会起作用。
DElete from x where col = 0 and primarykey not in ( PrimaryKey from x Inner Join Y on x.FKey = Y.PrimaryKey )