1

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

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

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

我使用postgres。如果那是一个特别针对它的答案,那就更好了。=]

对不起我的英语不好(不是母语)。

4

2 回答 2

5

我通常使用类似的查询

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);

..ETC..

于 2012-11-09T20:12:50.417 回答
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 文档中的 FOREIGN KEY 部分

于 2012-11-09T20:30:15.100 回答