
# 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');
```
请注意，这种场景下无法再通过数据库来确保插入的数据不会冲突，需要通过业务来判断数据冲突与否的不同处理逻辑。
