我有一个SQL查询,我想在单个查询中插入多行。所以我使用了类似这样的东西:
$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'
不存在,则应该插入行。
我想使用:
INSERT INTO beautiful (name, age)
VALUES
('Helen', 24),
('Katrina', 21),
('Samia', 22),
('Hui Ling', 25),
('Yumie', 29) ON DUPLICATE KEY UPDATE
这就是陷阱。我被卡住了,不知道该怎么做。我一次有多个行要插入/更新。请给我指个方向。谢谢。
发布于 2018-05-18 05:04:03
插入到...重复密钥更新仅适用于MYSQL,不适用于SQL Server。
对于SQL server,解决方法是首先声明一个临时表,向该临时表插入值,然后使用合并。
如下所示:
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);
发布于 2021-01-06 02:32:55
我使用jdbi的BindBeanList寻找相同的行为,发现语法与Peter Lang上面的答案完全相同。如果有人遇到这个问题,下面是我的代码:
@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()
调用的列名不同。
发布于 2010-04-26 23:18:40
您可以使用Replace而不是INSERT ...在重复密钥更新时。
https://stackoverflow.com/questions/2714587
复制相似问题