MySQL插入忽略:是否可以判断哪个插入失败?

时间:2020-09-23 20:58:00

标签: mysql sql sql-insert create-table

例如如果我有

insert ignore into users (email)
values ('exists@example.com'), ('doesnt-exist@example.com')

如果email是唯一的,并且已经有exists@example.com的行,则仅插入1行。是否可以分辨出插入了两行中的哪一行?

据我所知,insertId指的是插入的第一行,但我无法确定它是哪一行。

2 个答案:

答案 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

Demo on DB Fiddle

答案 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 <>提琴。