r-使用dbWriteTable写入具有现有键的表时出错



我正在运行下面的代码

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

并获得错误

错误:无法删除表'general_pop_estimates'上外键约束'general_pop_estimates_ibfk_1'引用的表'countries'。[3730]

我想知道这个是否有解决办法

当另一个表(而非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可能会抱怨必须首先删除另一个表中的数据。在这种情况下,您仍然需要找到外部表并删除其数据。(我确实警告过这些选项是破坏性不可逆,不是吗?(

最新更新