例如如果我有
insert ignore into users (email)
values ('exists@example.com'), ('doesnt-exist@example.com')
如果email
是唯一的,并且已经有exists@example.com
的行,则仅插入1行。是否可以分辨出插入了两行中的哪一行?
据我所知,insertId
指的是插入的第一行,但我无法确定它是哪一行。
答案 0 :(得分:1)
在MySQL中,一种选择是在表中保留另一列,以跟踪每行更新的最后日期:
create table users (
id int auto_increment primary key,
email varchar(50) unique,
updated_at timestamp default current_timestamp on update current_timestamp
);
现在,说表的内容是:
id | email | updated_at -: | :----------------- | :------------------ 1 | exists@example.com | 2020-09-23 00:00:00
您运行insert语句,该语句尝试插入一个副本:
insert ignore into users (email)
values ('exists@example.com'), ('doesnt-exist@example.com')
您可以使用updated_at
标识插入的行:
id | email | updated_at -: | :----------------------- | :------------------ 1 | exists@example.com | 2020-09-23 00:00:00 2 | doesnt-exist@example.com | 2020-09-23 22:33:42
答案 1 :(得分:0)
这回答了相反的问题,即未插入 值。我不确定这是否有趣。
但是,如果可以,您可以在on duplicate key update
上使用此技巧:
insert into users (email)
values ('exists@example.com'), ('doesnt-exist@example.com')
on duplicate key update email = (case when @emails := concat_ws(',', @emails, values(email)) then values(email) else values(email) end);
select @emails;
这是一个db <>提琴。