【问题标题】:Error while using dbWriteTable to write a table with existing key使用 dbWriteTable 使用现有键写入表时出错
【发布时间】:2021-01-09 21:43:27
【问题描述】:

我正在运行下面的代码

dbWriteTable(conn = mydb, "countries", cntr, overwrite = TRUE, row.names = FALSE)

并得到错误

错误:无法删除表“general_pop_estimates”上的外键约束“general_pop_estimates_ibfk_1”引用的表“国家”。 [3730]

我想知道是否有解决方法

【问题讨论】:

    标签: r dbi rmariadb


    【解决方案1】:

    当另一个表(不是countries)与countries 中的一个字段有键关系时,这种类型的错误很常见。当overwrite=TRUE 出现时,dbWriteTable 中的默认机制似乎是完全删除表、重建其架构并插入数据。删除表会破坏外键约束。

    您有几个选择。 两者都不应该盲目地完成,因为它们都是不可逆的(除了从备份中恢复):

    1. 找到外键并以某种方式破坏关系,方法是删除外键或删除从属表。一旦外键约束不再存在,这种删除countries 并重建的方法应该可以正常工作(即,使用与您之前尝试过的代码相同的代码)。

    2. 保留外键约束,只删除当前countries 中的行并插入新数据。这假设表的架构不需要更改(所有类型都相同,等等)。也许:

      dbExecute(conn = mydb, "delete from countries")
      dbWriteTable(conn = mydb, "countries", cntr, overwrite = FALSE, row.names = FALSE)
      # might need to add append=TRUE to that last call
      

      不过,这有点未经测试——根据外键关系的级联方式,DBMS 可能会抱怨必须先删除另一个表中的数据。在这种情况下,您仍然需要找到外表并删除其数据。 (我确实警告过这些选项是破坏性不可逆的,不是吗?)

    【讨论】:

    • 非常感谢@r2evans 提出的解决方案。我会明智地做出决定。
    • 您的问题解决了吗?
    • 我决定使用 if else 语句作为解决方法,看起来效果很好。
    猜你喜欢
    • 2014-03-09
    • 2020-05-02
    • 2020-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多