2012-12-14 56 views
1

我有一個表格barcodes,其中有1000行的barcode。大部分的條碼被連接到另一臺(有很多不同的表,它可以連接到)通過外鍵約束,所以如果我跑下面的查詢,它會出錯,因爲約束的:有沒有辦法找出我的數據是通過外鍵約束連接還是不連接到MySQL?

delete from barcodes 

但不知何故(通過我在數據庫中創建的一些設計缺陷),表中有條形碼沒有被任何約束連接,並且只是自由浮動的。

是否有一些簡單的查詢只能拉回未通過約束連接的條形碼?像這樣的僞代碼:

select * from barcodes where constraint = null 
+0

也許這將幫助:http://stackoverflow.com/questions/4004205/mysql-show-constraints-on-tables-command – RonaldBarzell

回答

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名假設,你必須改變那些適合您的環境。


一旦你找到引用條形碼的幾個表,你可以放在一起一個查詢測試所有這些一次,並認爲是完全免費的所有家屬的條形碼:

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。

+0

我希望有一個更簡單的方法,因爲我有連接到這麼多表一個條形碼錶。我意識到你的答案可能是唯一的方法。 –

+0

查看上面的提示。 –

相關問題