删除表中的行,但保留具有FK约束的行

时间:2012-07-05 20:10:22

标签: sql sql-server delete-row

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

DELETE FROM TABLE_X WHERE COL_A = 0

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

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

5 个答案:

答案 0 :(得分: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语句来捕获违规。您运行该语句以获取违反约束的实际行。

答案 1 :(得分:1)

这样的事可能会对你有所帮助:

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

DELETE FROM TABLE_X,其中Y_ID不在(SELECT Y_ID FROM TABLE_Y)

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

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

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

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

答案 4 :(得分:0)

从x中删除 col = 0 和 主键不在( 首要的关键 来自x 内部加入Y在x.FKey = Y.PrimaryKey上 )