U0400020:GaussDB中INSERT ON DUPLICATE KEY UPDATE不支持更新主键或唯一键
描述
数据库类型与版本
- 源库类型与版本:MySQL 5.5、5.6、5.7、8.0版本。
- 目标库类型与版本:GaussDB所有版本。
语法示例
INSERT ON DUPLICATE KEY UPDATE语句用于带有唯一约束(UNIQUE INDEX或PRIMARY KEY)的表,如果插入表中的数据违反了唯一约束,则对冲突行执行UPDATE子句完成更新。但是在GaussDB中,主键、唯一索引列不允许UPDATE,如下示例UGO转换时不处理,并给出此错误提示。
CREATE TABLE duplicate_key_test ( id INT PRIMARY KEY, info VARCHAR(10) UNIQUE ); INSERT INTO duplicate_key_test VALUES (1, 'AA'), (2,'BB'), (3, 'CC'); INSERT INTO duplicate_key_test VALUES (10, 'DD'), (3, 'EE') ON DUPLICATE KEY UPDATE info = VALUES(info);
改造建议
如果确实需要更新唯一键,可以先使用DELETE语句删除具有旧键值的行,然后使用INSERT语句插入新行。如上述示例的手改方案参考:
DELETE FROM duplicate_key_test WHERE id in (10, 3); INSERT INTO duplicate_key_test VALUES (10, 'DD'), (3, 'EE');
请注意,这种场景下无法再通过数据库来确保插入的数据不会冲突,需要通过业务来判断数据冲突与否的不同处理逻辑。