【问题标题】:How to overwrite a record with same primary key in SQL Server?如何在 SQL Server 中覆盖具有相同主键的记录?
【发布时间】:2022-01-17 19:51:35
【问题描述】:

我正在使用 Python 将数据推送到 SQL Server。假设我有一个如下表:

我正在使用以下代码和查询推送数据

query = """INSERT INTO TestTable (Key, One, Two) values(?,?,?)"""

接下来,我想在“Two”列和两个新行中推送一个值为“A2”、“A3”的数据,如下所示:

如果主键不存在,我希望查询插入新行,并在主键存在时覆盖该行。我尝试使用 REPLACE INTO 而不是 INSERT INTO,但这似乎在 SQL Server 中不起作用。

请你帮忙。

【问题讨论】:

  • 我认为您所说的是通常被称为“upsert”的内容(如果存在则更新,否则插入)。你可以在这里阅读一些方法:sqlperformance.com/2020/09/locking/upsert-anti-pattern
  • 根据问题指南,请不要发布代码、数据、错误消息等的图像 - 将文本复制或输入到问题中。请保留将图像用于图表或演示渲染错误,无法通过文本准确描述的事情。

标签: python sql sql-server


【解决方案1】:

Sql Server 支持 MERGE 语句用于 upserts。

要插入 1 个元组,可以使用 VALUES

MERGE TestTable AS t
USING (VALUES (?,?,?)) AS s([Key], One, Two) 
ON (s.[Key] = t.[Key])
WHEN NOT MATCHED BY Target THEN
  INSERT ([Key], One, Two) 
  VALUES (s.[Key], s.One, s.Two) 
WHEN MATCHED THEN UPDATE SET
  One = s.One,
  Two = s.Two;

db小提琴here

【讨论】:

  • 效果很好..太棒了..
  • 如果还有一列说“三”,查询会怎样?主键是“键”和“三”列的组合(复合键)。
  • 有复合PK?然后更改ON 子句和INSERTdb小提琴here
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-05-04
  • 1970-01-01
  • 2023-01-11
  • 2022-01-25
  • 2019-05-25
  • 1970-01-01
  • 2017-12-31
相关资源
最近更新 更多