更新时间:2024-01-12 GMT+08:00
分享

INSERT

  • 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()的用法。

分享:

    相关文档

    相关产品