0

我需要删除表中的行,例如

DELETE FROM TABLE_X WHERE COL_A = 0

但我不想删除任何可能违反约束的行,我需要知道哪些行有这种违反......

我知道我可以与关系表进行连接,但我想知道是否存在任何通用方法来知道删除时哪些行会违反约束。

4

5 回答 5

1

假设您使用 JDBC,有一个名为 GetExportedKeys() 的元数据函数

http://docs.oracle.com/javase/7/docs/api/java/sql/DatabaseMetaData.html#getExportedKeys%28java.lang.String,%20java.lang.String,%20java.lang.String%29

使用它,您首先获得外键约束。使用该信息,您可以构建一个 Join 语句来捕获违规行为。您运行该语句以获取违反约束的实际行。

于 2012-07-05T20:18:16.117 回答
1

这样的事情可能会帮助你:

/* 表 X 是子表 表 Y 是父表 */

DELETE FROM TABLE_X where Y_ID not in (SELECT Y_ID FROM TABLE_Y)

于 2012-07-05T20:33:40.603 回答
0

没有通用的方法。您需要使用连接(或在运行时从通用但非内置的元数据生成连接)。

于 2012-07-05T20:14:00.707 回答
0

您可以检查系统表、解析约束并使用它们动态构建 JOIN。这并不容易。

另一种方法是逐个删除行(SELECT所有 ID,然后使用其主键值删除每一行)。失败的DELETE操作是删除带有约束的行。

在事务中执行此操作并在最后回滚,因此您实际上不会删除这些行。

顺便说一句,我不推荐这种做法,它很奇怪而且效率低下。但它会起作用。

于 2012-07-05T20:16:02.517 回答
0

DElete from x where col = 0 and primarykey not in ( PrimaryKey from x Inner Join Y on x.FKey = Y.PrimaryKey )

于 2012-07-05T20:17:00.523 回答