首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在单个查询中插入多行的重复键更新时的MySQL

在单个查询中插入多行的重复键更新时的MySQL
EN

Stack Overflow用户
提问于 2010-04-26 23:16:06
回答 3查看 132.5K关注 0票数 230

我有一个SQL查询,我想在单个查询中插入多行。所以我使用了类似这样的东西:

代码语言:javascript
复制
$sql = "INSERT INTO beautiful (name, age)
  VALUES
  ('Helen', 24),
  ('Katrina', 21),
  ('Samia', 22),
  ('Hui Ling', 25),
  ('Yumie', 29)";

mysql_query( $sql, $conn );

问题是,当我执行这个查询时,我想检查是否应该检查UNIQUE键(不是上面的PRIMARY KEY),例如上面的'name',如果这样的'name'已经存在,则应该更新相应的整行,否则插入。

例如,在下面的示例中,如果数据库中已经存在'Katrina',则应更新整行,而不考虑字段的数量。同样,如果'Samia'不存在,则应该插入行。

我想使用:

代码语言:javascript
复制
INSERT INTO beautiful (name, age)
      VALUES
      ('Helen', 24),
      ('Katrina', 21),
      ('Samia', 22),
      ('Hui Ling', 25),
      ('Yumie', 29) ON DUPLICATE KEY UPDATE

这就是陷阱。我被卡住了,不知道该怎么做。我一次有多个行要插入/更新。请给我指个方向。谢谢。

EN

回答 3

Stack Overflow用户

发布于 2018-05-18 05:04:03

插入到...重复密钥更新仅适用于MYSQL,不适用于SQL Server。

对于SQL server,解决方法是首先声明一个临时表,向该临时表插入值,然后使用合并。

如下所示:

代码语言:javascript
复制
declare @Source table
(
name varchar(30),
age decimal(23,0)
)

insert into @Source VALUES
('Helen', 24),
('Katrina', 21),
('Samia', 22),
('Hui Ling', 25),
('Yumie', 29);


MERGE beautiful  AS Tg
using  @source as Sc
on tg.namet=sc.name 

when matched then update 
set tg.age=sc.age

when not matched then 
insert (name, age) VALUES
(SC.name, sc.age);
票数 1
EN

Stack Overflow用户

发布于 2021-01-06 02:32:55

我使用jdbi的BindBeanList寻找相同的行为,发现语法与Peter Lang上面的答案完全相同。如果有人遇到这个问题,下面是我的代码:

代码语言:javascript
复制
  @SqlUpdate("INSERT INTO table_one (col_one, col_two) VALUES <beans> ON DUPLICATE KEY UPDATE col_one=VALUES(col_one), col_two=VALUES(col_two)")
void insertBeans(@BindBeanList(value = "beans", propertyNames = {"colOne", "colTwo"}) List<Beans> beans);

需要注意的一个关键细节是,在@BindBeanList注释中指定的propertyName与在更新时传递给VALUES()调用的列名不同。

票数 0
EN

Stack Overflow用户

发布于 2010-04-26 23:18:40

您可以使用Replace而不是INSERT ...在重复密钥更新时。

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2714587

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档