制約はバーコードテーブルではなく、バーコードに依存する他のテーブルにあります。他のテーブルに特定のバーコードに依存する行がある場合、制約により特定のバーコードを削除できなくなります。したがって、依存テーブルに行があるかどうかを確認する必要があります。
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です。