如何通过R代码更新SQL Server中已存在的EuroStat数据表格?
问题描述
我通过以下R代码从EuroStat下载数据:
library(eurostat) tps00176<-get_eurostat("tps00176",time_format = "num")%>% data.frame()
代码执行成功后,用以下代码将数据导入SQL Server:
sqlSave(uat_conn, tps00176, tablename = "integration.tps00176",rownames=FALSE, varTypes = c( "citizen"="varchar(5)", "agedef"="varchar(8)", "age"="varchar(6)", "unit"="varchar(3)", "sex"="varchar(2)", "geo"="varchar(3)", "time"="integer", "values"="integer"))
上述操作均正常,但后续尝试更新数据时,R中出现报错提示表已存在:
Error in sqlSave(uat_conn, integration.tps00176, tablename = "integration.integration.tps00176", : table ‘integration.integration.tps00176’ already exists
请求帮助:如何通过R命令更新该表格而非重新创建?
解决方案
首先要注意:你报错里的表名integration.integration.tps00176是重复添加了schema前缀,这是本次报错的直接原因,先修正表名,再根据需求选择以下更新方式:
1. 追加数据到现有表
如果只需将新数据添加到表末尾,直接在sqlSave中添加append=TRUE参数,同时确保表名正确:
sqlSave(uat_conn, tps00176, tablename = "integration.tps00176", rownames=FALSE, append=TRUE, varTypes = c( "citizen"="varchar(5)", "agedef"="varchar(8)", "age"="varchar(6)", "unit"="varchar(3)", "sex"="varchar(2)", "geo"="varchar(3)", "time"="integer", "values"="integer"))
注意:该方式不会处理重复行,若需去重,需先在R中清洗数据再导入。
2. 根据主键更新匹配行
如果需要基于唯一标识列(如geo、time)更新现有行,使用sqlUpdate函数,并指定匹配的主键列:
sqlUpdate(uat_conn, tps00176, tablename = "integration.tps00176", index=c("geo", "time"), # 填入用于匹配行的主键列 rownames=FALSE, varTypes = c( "citizen"="varchar(5)", "agedef"="varchar(8)", "age"="varchar(6)", "unit"="varchar(3)", "sex"="varchar(2)", "geo"="varchar(3)", "time"="integer", "values"="integer"))
注意:sqlUpdate仅更新与index列匹配的行,无匹配的行不会自动插入;若需同时实现更新+插入,需自行预处理数据。
3. 彻底替换表数据(不推荐频繁使用)
若需完全替换现有表数据,可先删除旧表再重新导入:
sqlDrop(uat_conn, "integration.tps00176") # 执行原sqlSave命令重新导入 sqlSave(uat_conn, tps00176, tablename = "integration.tps00176",rownames=FALSE, varTypes = c( "citizen"="varchar(5)", "agedef"="varchar(8)", "age"="varchar(6)", "unit"="varchar(3)", "sex"="varchar(2)", "geo"="varchar(3)", "time"="integer", "values"="integer"))
内容的提问来源于stack exchange,提问作者silent_hunter
相关产品推荐
相关产品推荐

