使用 R(DBI 包)从 SQL Server 表中删除行

ok1*_*ore 4 odbc r dbi dplyr

我在 SQL Server 中有一个表,我正在尝试向其中添加数据。在添加数据之前,我想删除所有现有记录,但我不想删除该表并重新创建它,因为它在 SQL Server 中创建了我想保留的索引。

我有什么选择来使用 r 来完成这个?

Ker*_*son 8

有多种方法可以删除表中的所有记录。

你可以TRUNCATEDELETE

dbExecute(con, "TRUNCATE TABLE TableName")
dbExecute(con, "DELETE FROM TableName")
Run Code Online (Sandbox Code Playgroud)

编辑:使用dbExecute()而不是dbSendQuery().

正如文档中所评论的 dbSendQuery()

此方法仅适用于 SELECT 查询。出于兼容性原因,某些后端可能会通过此方法支持数据操作查询。但是,强烈建议调用者将 dbSendStatement() 用于数据操作语句。

但是,send方法不会自动清除返回的结果对象。因此getexecute方法更适合交互使用。从dbSendStatement()文档:

要查询受影响的行数,请对返回的结果对象调用 dbGetRowsAffected()。您还必须在此之后调用 dbClearResult()。对于交互式使用,您几乎总是更喜欢 dbExecute()。


小智 7

如果您只需要删除某些记录

要回答另一个用例,当您需要从数据库中仅删除某些记录时,您可以创建一个查询列表,然后使用映射来执行它们。例如,下一个代码将删除 id 为 1 到 5 的行。

library(purrr) # for the map() function

# listing the ids we want to delete
ids = c(1,2,3,4,5)

# creating list of DELETE queries with each id
delete_queries = paste0("DELETE FROM tablename WHERE (id = '", ids, "');")

# executing each query
map(.x = delete_queries, .f = dbExecute, conn = con)
Run Code Online (Sandbox Code Playgroud)

请注意,我们使用 dbExecute 而不是 dbSendQuery,因为它返回受影响的记录数,因此我们可以确定操作已发生。