greatesql8.0.26 insert ignore仍然报Duplicate entry
本帖最后由 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);
报错如下:
Duplicate entry '1' for key 'test01.PRIMARY'
解决方案:去掉STRICT_TRANS_TABLES
set global sql_mode='NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
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一条数据也会报错?应该是其他原因导致的,好好查查。 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:33
采用标准的sql mode就好,需要的话再调整。
本案中,你把STRICT_TRANS_TABLES去掉其实有点不合规了,可能 ...
再补充说下,在MySQL 8.0中,默认的sql mode下
select @@sql_mode;
+-----------------------------------------------------------------------------------------------------------------------------------------+
| @@sql_mode |
+-----------------------------------------------------------------------------------------------------------------------------------------+
| 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 |
+-----------------------------------------------------------------------------------------------------------------------------------------+
insert写入重复值才会报error,但如果改成insert ignore则只会报warn,需要再看下你当时实际怎么用的了。
页:
[1]