約束不在條形碼錶上,它在依賴於條形碼的其他表上。約束條件阻止您刪除特定條形碼如果其他表中依賴於這些特定條形碼的行存在。所以你需要知道從屬表中是否有行。
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名假設,你必須改變那些適合您的環境。
一旦你找到引用條形碼的幾個表,你可以放在一起一個查詢測試所有這些一次,並認爲是完全免費的所有家屬的條形碼:
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。
也許這將幫助:http://stackoverflow.com/questions/4004205/mysql-show-constraints-on-tables-command – RonaldBarzell