如何忽略MySQL中insert语句的连续重复
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何忽略MySQL中insert语句的连续重复相关的知识,希望对你有一定的参考价值。
我想忽略重复(或重复更新密钥),但仅限于连续重复。
说我的初始表看起来像这样(uk
和a
是列名):
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中如何设置一个字段,表中每增加一个值,这个字段自动产生一个连续的序号?