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