GreatSQL社区

搜索

[已解决] greatesql8.0.26 insert ignore仍然报Duplicate entry

2144 4 2023-1-4 16:54
本帖最后由 fuhao009 于 2023-1-5 09:18 编辑

create table test01(id int PRIMARY KEY);
连续执行插入

insert ignore into test01(id) values(1);
insert ignore into test01(id) values(1);
报错如下:
[23000][1062] Duplicate entry '1' for key 'test01.PRIMARY'

全部回复(4)
fuhao009 2023-1-5 08:16:14
解决方案:去掉STRICT_TRANS_TABLES
set global sql_mode='NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
yejr 2023-1-5 08:19:29
fuhao009 发表于 2023-1-5 08:16
解决方案:去掉STRICT_TRANS_TABLES
set global sql_mode='NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISI ...

空表insert ignore一条数据也会报错?应该是其他原因导致的,好好查查。
yejr 2023-1-5 08:33:39
fuhao009 发表于 2023-1-5 08:16
解决方案:去掉STRICT_TRANS_TABLES
set global sql_mode='NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISI ...

采用标准的sql mode就好,需要的话再调整。
本案中,你把STRICT_TRANS_TABLES去掉其实有点不合规了,可能也会导致其他异常
比如一个列是varchar(10),写入20个字符,这时候不是error而是warn,又回到<=5.6的老路子上去。
可能为了适配老业务代码才这么改,新的业务还是不要这么搞,以后可能出错了都不知道,还以为成功了。
像这里说的varchar(10)例子,insert后只有warn没有error,可能会以为写入20个字符都成功了,实际是被截断。
insert ignore改成replace,或者加上on duplicate key处理。
MySQL以前被诟病"不正规"的一个地方就是这里说的场景,所以才修改默认sql mode,尽量不要回退到旧模式。
yejr 2023-1-5 08:56:32
yejr 发表于 2023-1-5 08:33
采用标准的sql mode就好,需要的话再调整。
本案中,你把STRICT_TRANS_TABLES去掉其实有点不合规了,可能 ...

再补充说下,在MySQL 8.0中,默认的sql mode下
  1. select @@sql_mode;
  2. +-----------------------------------------------------------------------------------------------------------------------------------------+
  3. | @@sql_mode                                                                                                                              |
  4. +-----------------------------------------------------------------------------------------------------------------------------------------+
  5. | ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,STRICT_ALL_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION |
  6. +-----------------------------------------------------------------------------------------------------------------------------------------+
复制代码


insert写入重复值才会报error,但如果改成insert ignore则只会报warn,需要再看下你当时实际怎么用的了。
fuhao009

27

主题

0

博客

100

贡献

注册会员

Rank: 2

积分
169

2022年度求知人物2022年度活跃用户月度求知人物勤学好问(铜)助人为乐(铜)

合作电话:010-64087828

社区邮箱:greatsql@greatdb.com

社区公众号
社区小助手
QQ群
GMT+8, 2024-11-22 01:29 , Processed in 0.018710 second(s), 13 queries , Redis On.
快速回复 返回顶部 返回列表