【问题标题】:how to check if a foreign key is set to a non existing primary key?如何检查外键是否设置为不存在的主键?
【发布时间】:2012-11-09 20:08:17
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 如果在两个表之间定义了外键约束,那么绝对no可以将其设置为不存在的主键。这正是外键的意义所在。这听起来像你是不在数据库中使用真正的外键约束 - 你应该
  • 我不会说不。你可以禁用触发器;-)

标签: sql postgresql foreign-keys primary-key


【解决方案1】:

我通常使用这样的查询

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

..等等..

【讨论】:

    【解决方案2】:

    我不熟悉 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中的外键部分

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多