使用dbWriteTable编写具有现有键的表时发生错误

问题描述

我正在运行下面的代码

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

并得到错误

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

我想知道是否可以解决这个问题

解决方法

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

您有两种选择。 两者都不应该盲目地完成,因为它们都是不可逆的(除了从备份还原之外):

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

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...