【发布时间】: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]
我想知道是否有解决方法
【问题讨论】:
我正在运行下面的代码
dbWriteTable(conn = mydb, "countries", cntr, overwrite = TRUE, row.names = FALSE)
并得到错误
错误:无法删除表“general_pop_estimates”上的外键约束“general_pop_estimates_ibfk_1”引用的表“国家”。 [3730]
我想知道是否有解决方法
【问题讨论】:
当另一个表(不是countries)与countries 中的一个字段有键关系时,这种类型的错误很常见。当overwrite=TRUE 出现时,dbWriteTable 中的默认机制似乎是完全删除表、重建其架构并插入数据。删除表会破坏外键约束。
您有几个选择。 两者都不应该盲目地完成,因为它们都是不可逆的(除了从备份中恢复):
找到外键并以某种方式破坏关系,方法是删除外键或删除从属表。一旦外键约束不再存在,这种删除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 可能会抱怨必须先删除另一个表中的数据。在这种情况下,您仍然需要找到外表并删除其数据。 (我确实警告过这些选项是破坏性和不可逆的,不是吗?)
【讨论】: