您可以使用REPLACE语法往表中插入行或替换表中的行。

语法

REPLACE [LOW_PRIORITY | DELAYED]
[INTO] [schema_name.]tbl_name
[(col_name [, col_name] ...)]
{VALUES | VALUE} (value_list) [, (value_list)]

REPLACE [LOW_PRIORITY | DELAYED]
[INTO] [schema_name.]tbl_name
SET assignment_list

REPLACE [LOW_PRIORITY | DELAYED]
[INTO] [schema_name.]tbl_name
[(col_name [, col_name] ...)]
SELECT ...

value_list:
value [, value] ...

value:
{expr | DEFAULT}

assignment_list:
assignment [, assignment] ...

assignment:
col_name = value   

语法限制

不支持使用以下语法。

  • PARTITION语法,例如:
    REPLACE INTO tb PARTITION (p0) (id) VALUES(7);
  • 嵌套NEXTVAL的语法,例如:
    REPLACE INTO tb(id) VALUES(SEQ1.NEXTVAL + 1);
  • 包含列名的语法,例如:
    REPLACE INTO tb(id1, id2) VALUES(1, id1 + 1);

分布式事务限制

说明 如果您的表是分表,但是事务执行过程中没有跨库(如INSERT或UPDATE带拆分键),则仍视为单库事务。

开启分布式事务时,不支持如下REPLACE命令:

  • 表没有定义主键,例如:
    CREATE TABLE tb(id INT, name VARCHAR(10));
    REPLACE INTO tb VALUES(1, 'a');
  • 表没有拆分,主键自增但没有使用Sequence。例如:
    CREATE TABLE tb(id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(10));
    REPLACE INTO tb(name) VALUES('a');

    您可以指定该主键使用Sequence,避免这条限制,例如:

    CREATE TABLE tb(id INT PRIMARY KEY AUTO_INCREMENT BY GROUP, name VARCHAR(10));
    REPLACE INTO tb(name) VALUES('a');

相关文献

MySQL REPLACE语法。