例如,如果我有:
insert ignore into users (email)
values ('exists@example.com'), ('doesnt-exist@example.com')
如果email
是唯一的,并且已经有一行exists@example.com
,那么只插入一行。是否可以判断2行中的哪一行被插入?
据我所知,insertId
指的是插入的第一行,但我不知道是哪一行。
在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:002|doesnt-exist@example.com|2020-09-23 22:33:42
在DB Fiddle上演示
这回答了相反的问题,哪些值是而不是插入的。我不确定这是否感兴趣。
但如果是这样的话,你可以在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<gt;不停摆弄