1

我有一张表barcodes,里面有 1000 行barcode。大多数条形码通过外键约束附加到另一个表(它可以连接到许多不同的表),所以如果我运行以下查询,它会因为约束而出错:

delete from barcodes

但是不知何故(由于我在数据库中创建的一些设计缺陷)表中的条形码没有通过任何约束连接,并且只是自由浮动的。

是否有一些简单的查询可以仅拉回未通过约束连接的条形码?像这样的伪代码:

select * from barcodes where constraint = null
4

1 回答 1

2

约束不在条形码表上,它在依赖于条形码的其他表上。如果其他表中存在依赖于这些特定条形码的行,则该约束会阻止您删除特定条形码。所以你需要找出从属表中是否有任何行。

SELECT b.*
FROM barcodes b
LEFT OUTER JOIN child_table c ON b.barcode_id = c.barcode_id
WHERE c.barcode_id IS NULL;

说明:该查询尝试将barcodes中的行匹配到假设的表barcode_child,并且barcode_child中没有匹配的行,则OUTER JOIN对所有列都返回NULL,这意味着barcode中的行可以自由删除。

您可能有多个引用条形码的表格。外键约束将在这些表中定义。您可以使用此查询根据条形码找出哪些表有约束:

SELECT TABLE_SCHEMA, TABLE_NAME
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE (REFERENCED_TABLE_SCHEMA, REFERENCED_TABLE_NAME, REFERENCED_COLUMN_NAME) =
      ('barcode_schema', 'barcode', 'barcode_id');

我对barcode_schema 和barcode_id 名称做了假设,您必须更改它们以适应您的环境。


一旦找到引用条形码的几个表,您可以将一个查询放在一起,一次测试所有这些表,并找到完全没有所有依赖项的条形码:

SELECT b.*
FROM barcodes b
LEFT OUTER JOIN child_table1 c1 ON b.barcode_id = c1.barcode_id
LEFT OUTER JOIN child_table2 c2 ON b.barcode_id = c2.barcode_id
LEFT OUTER JOIN child_table3 c3 ON b.barcode_id = c3.barcode_id
...
WHERE COALESCE(c1.barcode_id, c2.barcode_id, c3.barcode_id, ...) IS NULL;

这只是我上面展示的第一个 SELECT 的扩展。将条形码加入其所有依赖表,如果在这些表中没有找到匹配项,则其所有列的COALESCE()仍为 NULL。

于 2012-12-14T19:46:22.083 回答