當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。