基于湖库一体架构,统一管理结构化、半结构化与非结构化等多模态数据,一个系统承载事务处理、实时分析与 AI 工作负载。
对大数据量表进行全表主键 +1 更新报错违反唯一约束
更新时间:2026-08-25 06:51
问题现象
对数据量较大的表执行针对主键的全表更新(例如 UPDATE t1 SET id = id + 1)时会报错,报错信息为违反唯一约束,错误码为 -5024,日志关键字为 discharge das write buffer failed(ret=-5024)。
复现示例(Oracle 模式):
create table t1 (id int primary key, name varchar2(10));
create sequence s1 start with 1 increment by 1 minvalue 1 maxvalue 999999999999999 nocycle cache 5000 noorder;
create trigger trg1
before insert on t1
for each row
when (NEW.id is null)
begin
select s1.nextval into :NEW.id from dual;
end;
/
begin
for i in 1..300000 loop
insert /*+ append */ into t1 nologging(name) values ('test');
commit;
end loop;
end;
/
update t1 set id = id + 1;
关键诊断信息
触发条件
- 表的主键为连续递增(每次 +1)生成,且表数据量较大。
- 对主键执行全表更新(如
UPDATE t1 SET id = id + 1)时触发。
事后诊断
- 报错信息:违反唯一约束,错误码 -5024。
- 日志关键字:
discharge das write buffer failed(ret=-5024)。
问题原因
必要条件:主键为递增 +1 生成,且数据量较大。
执行 UPDATE 操作时,数据库内部会先删除旧数据再插入新数据。当主键值连续递增且数据量较大时,更新过程中新写入的主键值会与尚未处理的既有主键值发生冲突,触发主键唯一约束冲突,导致报错 -5024;数据量较小时不会触发该问题。
问题的风险及影响
执行 SQL 报错 -5024,更新操作失败。
影响租户
| sys | MySQL | Oracle |
|---|---|---|
| — | — | — |
影响版本
OBServer 4.x 版本。
解决方法
- 先删除表的主键。
- 执行更新操作。
- 更新完成后,重新添加主键。
规避方式
避免直接对数据量较大的表执行主键全表更新(如主键整体 +1);确需更新主键值时,建议先删除主键,完成更新后再重新添加主键。