如何忽略MySQL中insert语句的连续重复

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何忽略MySQL中insert语句的连续重复相关的知识,希望对你有一定的参考价值。

我想忽略重复(或重复更新密钥),但仅限于连续重复。

说我的初始表看起来像这样(uka是列名):

uk a
----
x  1

迭代1插入1所以我希望忽略它以避免重复。

迭代2插入2,我的表现在看起来像这样:

uk  a
----
x   1
x   2

迭代3插入1,因为我的唯一键= x的最后一行与1不同,所以我希望再次插入1:

uk  a
----
x   1
x   2
x   1

如何在mysql中实现这一目标?

我目前的解决方案是首先从表中查询数据并删除这些重复项,但我更希望它是由MySQL处理的。

答案

您需要一个将成为自动增量主键的列

CREATE TABLE your_table(
 id INT NOT NULL AUTO_INCREMENT,
 uk CHAR(30) NOT NULL,
 a INT,
 PRIMARY KEY (id)
);
INSERT INTO your_table(uk, a) VALUES ('x', 1)

现在您可以使用以下insert命令来避免重复描述

INSERT INTO your_table(uk, a)
SELECT 'x', 1 FROM your_table t1
JOIN (
   SELECT max(id) maxid, uk 
   FROM your_table
   GROUP BY uk
) t ON t.maxid = t1.id and 
       t1.a != 1 and
       t.uk = 'x'

第二个插入可以是以下

INSERT INTO your_table(uk, a)
SELECT 'x', 2 FROM your_table t1
JOIN (
   SELECT max(id) maxid, uk 
   FROM your_table
   GROUP BY uk
) t ON t.maxid = t1.id and 
       t1.a != 2 and
       t.uk = 'x'

第三个插入与第一个插入相同,结果表将按预期进行。

demo

另一答案

从您的表中看不到,最后插入了哪些值。表中的数据被认为是无序的。因此,对于您的上一个示例,我们知道表中有三个记录x | 1,x | 1,x | 2,但不是最后是否插入了x | 1或x | 2。您需要一个额外的列来表明这一点。这可以是日期时间或升序ID。

如果您不想更改表,则需要一个包含最后一条记录的帮助程序表。无论如何,你要编写一个before-insert触发器来查找最后插入的值,并在新记录匹配uk的最后一个插入记录时抛出错误。

create table mytable(uk char(1), a int);
create table mytable_helper(uk char(1), a int, primary key (uk));

create trigger mytable_ins BEFORE INSERT ON mytable FOR EACH ROW
begin
  DECLARE msg VARCHAR(128);
  if exists (select * from mytable_helper h where new.uk = h.uk and new.a = h.a) then 
    set msg = concat('Consecutive duplicate for a = ', new.a, ' and uk = ''', new.uk, '''.');
    SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = msg;
  else
    replace into mytable_helper (uk, a) values (new.uk, new.a);
  end if;
end;

insert into mytable (uk, a) values ('x', 1);
insert into mytable (uk, a) values ('x', 2);
insert into mytable (uk, a) values ('x', 1);
insert into mytable (uk, a) values ('y', 3);
insert into mytable (uk, a) values ('x', 1);

Error(s), warning(s):
Consecutive duplicate for a = 1 and uk = 'x'.

最快的卡特斯

以上是关于如何忽略MySQL中insert语句的连续重复的主要内容,如果未能解决你的问题,请参考以下文章

MySQL - 忽略插入错误:重复条目

mysql中如何设置一个字段,表中每增加一个值,这个字段自动产生一个连续的序号?

MySQL 语句级避免重复插入—— Insert Select Not Exist

mysql 插入数据如何防止重复

如何合并行中重复的单元格值?我的代码忽略了一些重复的值

MySql 数据导出/导入一些Tips