问题描述
我正在运行下面的代码
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
中的默认机制是完全删除表,重建其架构并插入数据。删除表会破坏外键约束。
您有两种选择。 两者都不应该盲目地完成,因为它们都是不可逆的(除了从备份还原之外):
-
查找外键,并通过删除外键或从属表来中断关系。一旦外键约束不再存在,这种删除
countries
并进行重构的方法应该可以正常工作(即,使用与之前尝试的代码相同的代码)。 -
保留外键约束,只需从当前
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可能会抱怨必须先删除另一个表中的数据。在这种情况下,您仍然需要找到外部表并删除其数据。 (我确实警告过这些选择是破坏性的和不可逆的,不是吗?)