2012-12-14 24 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

查看上面的提示。 –

相关问题