当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


R dbplyr sql_query_insert 生成用于插入、更新、更新插入和删除的 SQL


这些函数生成 rows_*(in_place = TRUE) 中使用的 SQL。

用法

sql_query_insert(
  con,
  x_name,
  y,
  by,
  ...,
  conflict = c("error", "ignore"),
  returning_cols = NULL,
  method = NULL
)

sql_query_append(con, x_name, y, ..., returning_cols = NULL)

sql_query_update_from(
  con,
  x_name,
  y,
  by,
  update_values,
  ...,
  returning_cols = NULL
)

sql_query_upsert(
  con,
  x_name,
  y,
  by,
  update_cols,
  ...,
  returning_cols = NULL,
  method = NULL
)

sql_query_delete(con, x_name, y, by, ..., returning_cols = NULL)

参数

con

数据库连接。

x_name

要更新的表的名称。

y

一个懒惰的表格。

by

给出关键列的未命名字符向量。键列必须同时存在于 xy 中。键通常唯一标识每一行,但这仅在使用 rows_update()rows_patch()rows_upsert() 时对 y 的键值强制执行。

默认情况下,我们使用 y 中的第一列,因为第一列是放置标识符变量的合理位置。

...

传递给方法的其他参数。

conflict

对于rows_insert()y中的键与x中的键冲突应该如何处理?如果 y 中的键已存在于 x 中,则会发生冲突。

之一:

  • "error" (默认值)如果 y 中的任何键与 x 中的键冲突,将会出错。

  • "ignore" 将忽略 y 中与 x 中的键冲突的行。

returning_cols

可选的。要返回的列的名称。

method

可选的。使用的方法。

update_values

指定如何更新列的命名 SQL 向量。

update_cols

要更新的列的名称。

SQL 查询。

细节

插入方法

"where_not_exists"

大多数数据库的默认值。

INSERT INTO x_name
SELECT *
FROM y
WHERE NOT EXISTS <match on by columns>

"on_conflict"

支持者:

  • Postgres

  • SQLite

此方法使用 ON CONFLICT 子句,因此需要在 by 中指定的列上有唯一索引。

更新插入方法

"merge"

根据SQL标准的upsert方法。它使用MERGE 语句

MERGE INTO x_name
USING y
  ON <match on by columns>
WHEN MATCHED THEN
  UPDATE SET ...
WHEN NOT MATCHED THEN
  INSERT ...

"on_conflict"

支持者:

  • Postgres

  • SQLite

此方法使用 ON CONFLICT 子句,因此需要在 by 中指定的列上有唯一索引。

"cte_update"

支持者:

  • Postgres

  • SQLite

  • Oracle

在添加对 ON CONFLICT 的支持之前,在 Postgres 和 SQLite 中更新插入的经典方法。更新在 CTE 子句中完成,然后将不匹配的值插入到 CTE 外部。

例子

lf <- lazy_frame(
  carrier = c("9E", "AA"),
  name = c("Endeavor Air Inc.", "American Airlines Inc."),
  con = simulate_postgres()
)

sql_query_upsert(
  simulate_postgres(),
  ident("airlines"),
  lf,
  by = "carrier",
  update_cols = "name"
)
#> <SQL> INSERT INTO `airlines` (`carrier`, `name`)
#> SELECT *
#> FROM `df` AS `...y`
#> WHERE true
#> ON CONFLICT  (`carrier`)
#> DO UPDATE
#> SET `name` = `excluded`.`name`
源代码:R/db-sql.R

相关用法


注:本文由纯净天空筛选整理自Hadley Wickham等大神的英文原创作品 Generate SQL for Insert, Update, Upsert, and Delete。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。