This is a read-only copy of the MariaDB Knowledgebase generated on 2024-11-14. For the latest, interactive version please visit https://mariadb.com/kb/.

REPLACE

语法

REPLACE [LOW_PRIORITY | DELAYED]
 [INTO] tbl_name [PARTITION (partition_list)] [(col,...)]
 {VALUES | VALUE} ({expr | DEFAULT},...),(...),...

或:

REPLACE [LOW_PRIORITY | DELAYED]
    [INTO] tbl_name [PARTITION (partition_list)]
    SET col={expr | DEFAULT}, ...

或:

REPLACE [LOW_PRIORITY | DELAYED]
    [INTO] tbl_name [PARTITION (partition_list)] [(col,...)]
    SELECT ...

描述

REPLACE工作方式完全等同于 INSERT语句,除了表中行的PRIMARY KEYUNIQUE索引键值重复时,REPLACE会先删除旧值,然后插入新值。如果表中有多个UNIQUE键,可能插入一行时会出现多个冲突,这种情况下,所有冲突的行都会被更新。

表名可使用db_name.tbl_name格式来指定,如果指定格式为tbl_name,则使用默认数据库(见Identifier Qualifiers)。因此,REPLACE ... SELECT可以在不同数据库之间拷贝数据。

REPLACE基本工作方式大致如下:

BEGIN;
SELECT 1 FROM t1 WHERE key=# FOR UPDATE;
IF found-row
  DELETE FROM t1 WHERE key=# ;
  INSERT INTO t1 VALUES (...);
END IF
END;

上述过程可替换为:

REPLACE INTO t1 VALUES (...)

REPLACE语句是MariaDB/MySQL对标准SQL的扩展。它可以插入数据、删除数据再插入数据。除此之外,MariaDB/MySQL对于重复值冲突的处理方式还有几种扩展,见IGNOREINSERT ON DUPLICATE KEY UPDATE

需要注意的是,如果表中没有PRIMARY KEYUNIQUE索引,那么REPLACE语句和INSERT语句完全等价,因为不会检测新行和表中已存在的行是否重复。

如果使用SET子句赋值,它不能从当前行获取数据作为新行的数据源。例如,使用赋值语句'SET col = col + 1',则右边引用的字段col的值不是某行中的col,而是使用默认值DEFAULT(col),因此该赋值语句等价于:'SET col = DEFAULT(col) + 1'。注意,当字段没有指定默认值时,DEFAULT()的值为0或null。

要使用REPLACE,必须拥有表的INSERTDELETE权限

在使用REPLACE语句之前,有几个需要注意的陷进:

  • 如果表中有AUTO_INCREMENT字段,将为该字段分配新值。
  • 如果有外键引用,则REPLACE会激活ON DELETE行为。
  • 如果REPLACE只是简单的插入数据,它只会触发INSERT触发器,如果它更新了已有数据,则会触发DELETE触发器和INSERT触发器。详细内容见:Trigger Overview

如果以上某些操作是你不想发生的,可以考虑使用INSERT ... ON DUPLICATE KEY UPDATE来替代REPLACE语句。

MariaDB starting with 10.0

PARTITION子句是从MariaDB 10.0中开始引入的新特性,详细信息见Partition Pruning and Selection

See also

Content reproduced on this site is the property of its respective owners, and this content is not reviewed in advance by MariaDB. The views, information and opinions expressed by this content do not necessarily represent those of MariaDB or any other party.