【问题标题】:Insert and alter in one statement在一个语句中插入和更改
【发布时间】:2013-07-05 16:12:35
【问题描述】:

我想将一组数据存储到数据库中但是如果它是预先存在的记录,我想更改它。否则,创建一个新的。是否有一个组合声明? (谷歌搜索时没有。)

现在,我最好的办法是检查是否已经存在,然后执行其中一项操作。对我来说似乎很麻烦。

create table Stuff (
  Id int identity(1001, 1) primary key clustered, 
  Beep int unique,
  Boop nvarchar(50))

【问题讨论】:

  • 根据数据库引擎有不同的实现,例如 MySQL 使用INSERT... ON DUPLICATE KEY,MSSQL 使用MERGE。如果您发布哪个 RDBMS,我可以为您指明特定 db 的正确语法方向
  • @StephLocke 抱歉 - 我忘记了数据库的种类。它是云中的 SQL Server,即 Azure。我将给 MERGE 一个重击,欢迎您发表评论作为回复,如果建议有效,我可以将其作为答案进行检查。

标签: sql azure-sql-database


【解决方案1】:

在 MYSQL 中:

您可以使用 INSERT ... ON DUPLICATE KEY UPDATE 。

例如:

INSERT INTO table (a,b,c) VALUES (4,5,6)
  ON DUPLICATE KEY UPDATE c=9;

欲了解更多信息:http://dev.mysql.com/doc/refman/5.6/en/insert-on-duplicate.html

【讨论】:

  • 对不起,我的错 - 没有告诉它是 SQL Azure。我一直忘记大多数人无法读心... :)
【解决方案2】:

MySQL 使用INSERT... ON DUPLICATE KEY,MSSQL 使用MERGE

MERGEsupported by Azure,我强烈推荐这个blog article,作为声明的一个很好的介绍

这是基于提供的架构的合并语句...

create table #Stuff (
  Id int identity(1001, 1) primary key clustered, 
  Beep int unique,
  Boop nvarchar(50),
  Baap nvarchar(50)
);

INSERT  INTO #Stuff VALUES (1,'boop', 'poop');
INSERT  INTO #Stuff VALUES (2,'beep', 'peep');

SELECT * FROM #STUFF;

MERGE #Stuff 
   USING (VALUES(1,'BeepBeep','PeepPeep')) AS TheNewThing(A,B,C)
     ON #Stuff.Beep = TheNewThing.A
WHEN MATCHED THEN UPDATE SET #Stuff.Boop = TheNewThing.B, #Stuff.Baap = 'fixed'
WHEN NOT MATCHED THEN INSERT (Beep,Boop,Baap) VALUES (
  TheNewThing.A, TheNewThing.B, TheNewThing.C);

SELECT * FROM #STUFF

我还找到了一个非常好的SO Q,它可能会成为很好的进一步阅读

【讨论】:

  • 我已经检查了 MERGE,但它确实令人困惑。我明白了规范部分,但最后一行带有美元符号之类的实在是太多了。我看错了吗?我怀疑我正在学习具有所有花里胡哨的语法,而实际上只需要一个基本的案例场景。请指教。
  • 昏暗的问题 - 你能在你的问题中提供一个模式,这样我可以帮助生成一些 SQL
  • 你太好了。请参阅我的问题中的编辑。应该识别记录的“相同性”的列是唯一的 int BeepId 仅用于相同的结果)。通常我不愿意要求别人做所有的工作,因为我更喜欢“杀死我自己的食物”,但这听起来很直截了当,所以我会接受。 :)
  • 是的,它帮助很大。不过还有两件事。 (1) 如果我希望更新表中的许多列 - 是否有比在我对您的答案的编辑中排列它们更紧凑的语法? (2) 将源的部分描述为列名是标准命名吗?我也冒昧地编辑了它。如果您发现它不合适,请纠正我。
  • 1) 不这么认为——这是标准的更新语法——但可能是错误的 2) 你可以为它们命名任何你喜欢的东西——我只是更喜欢用它们来命名事物以使事情更多稍后清除以进行调试/修改
【解决方案3】:

是的,您可以使用 pl/sql 轻松做到这一点,这里是示例代码,可以帮助您 http://docs.oracle.com/cd/B10501_01/appdev.920/a96624/01_oview.htm#7106

【讨论】:

  • 对不起,我的错 - 没有告诉它是 SQL Azure。我一直忘记大多数人无法读心... :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多