如何检查外键是否设置为不存在的主键?

时间:2012-11-09 20:08:18

标签: sql postgresql foreign-keys primary-key

有时我在使用BD At Work时遇到问题。通常是当我尝试使用会话关闭(着名的LazyInitializatioException)恢复或更新Java中的表时。 最后,有时问题是存在指向非现有主键索引值的外键。当它发生时,惰性实体无法正确加载。

那么,有没有办法检查表数据是否将外键索引设置为不存在的主键?

对于单个列很容易。但我的意思是对于有大约10或20个外键的表。

我正在使用postgres。如果这是一个特定的答案,它会好得多。 =]

抱歉我的英语不好(不是原生的)。

2 个答案:

答案 0 :(得分:4)

我通常使用像

这样的查询
SELECT * FROM my_table WHERE fk_field NOT IN (SELECT id FROM related_table);

它通常可以正常工作;我不确定是否有更适合此任务的事情(如果你使用ORM和/或总是DELETE .. CASCADE,你经常不会遇到这类问题)..

更新

当然,您可以使用它直接查询多个fk字段:

SELECT * FROM my_table WHERE fk_field NOT IN (SELECT id FROM related_table)
    OR fk_field2 NOT IN (SELECT id FROM related_table2)
    OR fk_field3 NOT IN (SELECT id FROM related_table3);

...等。

答案 1 :(得分:1)

我不熟悉Java和你提到的那些错误 最佳解决方案是在db中创建外键约束,如果从另一个表引用,则不允许删除记录。

如果你必须尝试:

select some_columns
from table1 t1 left join table2 t2 on (t1.id1 = t2.table1_id1)
where t2.id is null
limit 1

检查是否存在此类记录 如果这些表很大,则没有快速解决方案(通常以全表扫描结束)。

还可以使用外键约束自动执行级联删除或设置null。阅读postgresql docs

中的FOREIGN KEY部分