1

barcodes1000行の行を含むテーブルがあります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;

説明:このクエリは、バーコードの行を仮想テーブルbarcode_childに一致させようとします。一致する行がbarcode_childにない場合、OUTER JOINはすべての列に対してNULLを返します。これは、バーコードの行を自由に削除できることを意味します。

バーコードを参照するテーブルがいくつかある場合があります。外部キー制約は、これらのテーブルで定義されます。このクエリを使用すると、バーコードに応じてどのテーブルに制約があるかを確認できます。

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の名前を想定しましたが、環境に合わせてこれらを変更する必要があります。


バーコードを参照するいくつかのテーブルを見つけたら、それらすべてを一度にテストする1つのクエリをまとめて、すべての依存関係が完全にないバーコードを見つけることができます。

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 に答える