华为云云数据库GaussDBINSERT_云淘科技
INSERT ON DUPLICATE KEY UPDATE不支持对主键或唯一约束的列上执行UPDATE。
INSERT ON DUPLICATE KEY UPDATE的语义是对唯一约束冲突的行进行更新,这个过程中不应对约束的值进行更新。
INSERT ON DUPLICATE KEY UPDATE如果插入多条数据,这些数据之间不允许存在主键/唯一约束冲突。
与MySQL行为存在一定差异,MYSQL允许此行为,例如如下语句:
INSERT INTO t1 VALUES(1, 1), (1, 2) ON DUPLICATE KEY UPDATE col2 = VALUES(col2);
不符合SQL标准,SQL标准不允许在同一条SQL COMMAND中,对插入行同时进行修改,使得结果无可预期。例如上例中,假设col1为主键,那么此时会在同一个COMMAND中,既插入一条主键为1的,同时对已插入进行修改。由于事务串行化无法确认哪一个操作先执行,因此可能导致结果不稳定。
如果插入的数据本身存在冲突,在分布式场景下更新应以哪一条记录为准难以确定。
禁止对存在多个唯一约束的表执行INSERT ON DUPLICATE KEY UPDATE。
表中存在多个唯一约束包括存在多个唯一索引,或既存在主键(PRIMARY KEY),又存在唯一索引(UNQUE INDEX)两种情况。
当存在多个唯一约束时,会默认检查所有的唯一约束条件,只要任何一个约束存在冲突,就会对冲突行进行更新,即可能更新多条记录,与业务预期不相符。业务应给予更加明确的插入更新条件。
对于批量插入的情况,建议使用INSERT INTO TABLE1 VALUES (),(),(),执行效率将高于执行多条INSERT INTO VALUES()
由于目前无法识别多个值是否属于一个shard,所以要使用/*+ multinode */ 来允许此语句执行。
无论单条和多条插入,关键字均需是VALUES。
不支持MySQL的INSERT INTO mytable VALUE()的用法。
父主题: 数据库编程规范
同意关联代理商云淘科技,购买华为云产品更优惠(QQ 78315851)
内容没看懂? 不太想学习?想快速解决? 有偿解决: 联系专家