REPLACE
语法描述
REPLACE 不仅是一个字符串函数,还是一个替换操作的数据操作语句。REPLACE 语句的作用是向表中插入数据,如果表中已经存在符合条件的记录,则会先删除该记录,然后再插入新的数据。如果表中不存在符合条件的记录,则直接插入新的数据。
REPLACE 通常在具有唯一约束的表中使用。
REPLACE语句要求表中必须存在主键或唯一索引,用于判断是否已经存在相同的记录。- 使用 
REPLACE语句插入新记录时,如果已经存在相同主键或唯一索引的记录,旧记录将被删除,然后插入新记录,这可能导致自增列的值发生变化。 
语法结构
REPLACE
    [INTO] tbl_name
    [(col_name [, col_name] ...)]
    { VALUES(value_list)
      |
      VALUES row_constructor_list
    }
REPLACE
    [INTO] tbl_name
    SET assignment_list
value:
    {expr | DEFAULT}
value_list:
    value [, value] ...
row_constructor_list:
    ROW(value_list)
assignment:
    col_name = value
assignment_list:
    assignment [, assignment] ...
参数释义
REPLACE 语句用于向表中插入数据或更新已存在的数据。它的语法有两种形式:一种是基于列名的插入形式,另一种是基于 SET 子句的更新形式。
以下是各个参数的解释:
- 
INTO: 可选关键字,表示向哪张表插入数据或更新数据。 - 
tbl_name: 表示要插入或更新数据的表的名称。 - 
col_name: 可选参数,表示要插入或更新的列名。在插入形式中,可以通过列名指定要插入的列;在更新形式中,指定要更新的列。 - 
value: 表示要插入或更新的值。可以是具体的表达式(expr)或默认值(DEFAULT)。 - 
value_list: 表示一组要插入的值。多个值之间用逗号分隔。 - 
(暂不支持)
row_constructor_list: 表示用于插入的一组值构成的行。每一行的值使用括号括起来,并用逗号分隔。 - 
assignment: 表示一个列名和其对应的值的关联,用于更新形式。 - 
assignment_list: 表示多个列名和对应值的关联,用于更新形式。多个列名和值之间用逗号分隔。 
Note
- 当使用插入形式时,可以使用 
VALUES关键字后跟value_list或row_constructor_list来插入数据。VALUES后跟value_list表示插入一行数据,VALUES后跟row_constructor_list表示插入多行数据。 - 当使用更新形式时,使用 
SET关键字后跟assignment_list来指定要更新的列和对应的值。 
示例
create table names(id int PRIMARY KEY,name VARCHAR(255),age int);
-- 插入一行数据,id=1,name="Abby",age=24
replace into names(id, name, age) values(1,"Abby", 24);
mysql> select name, age from names where id = 1;
+------+------+
| name | age  |
+------+------+
| Abby |   24 |
+------+------+
1 row in set (0.00 sec)
mysql> select * from names;
+------+------+------+
| id   | name | age  |
+------+------+------+
|    1 | Abby |   24 |
+------+------+------+
1 row in set (0.00 sec)
-- 使用 replace 语句更新 id=1 的记录的 name 和 age 列的值为"Bob"和 25
replace into names(id, name, age) values(1,"Bobby", 25);
mysql> select name, age from names where id = 1;
+-------+------+
| name  | age  |
+-------+------+
| Bobby |   25 |
+-------+------+
1 row in set (0.00 sec)
mysql> select * from names;
+------+-------+------+
| id   | name  | age  |
+------+-------+------+
|    1 | Bobby |   25 |
+------+-------+------+
1 row in set (0.01 sec)
-- 使用 replace 语句插入一行数据,id=2,name="Ciro",age 为 NULL
replace into names set id = 2, name = "Ciro";
mysql> select name, age from names where id = 2;
+------+------+
| name | age  |
+------+------+
| Ciro | NULL |
+------+------+
1 row in set (0.01 sec)
mysql> select * from names;
+------+-------+------+
| id   | name  | age  |
+------+-------+------+
|    1 | Bobby |   25 |
|    2 | Ciro  | NULL |
+------+-------+------+
2 rows in set (0.00 sec)
-- 使用 replace 语句更新 id=2 的记录的 name 列的值为 "Ciro",age 列的值为 17
replace into names set id = 2, name = "Ciro", age = 17;
mysql> select name, age from names where id = 2;
+------+------+
| name | age  |
+------+------+
| Ciro |   17 |
+------+------+
1 row in set (0.01 sec)
mysql> select * from names;
+------+-------+------+
| id   | name  | age  |
+------+-------+------+
|    1 | Bobby |   25 |
|    2 | Ciro  |   17 |
+------+-------+------+
2 rows in set (0.01 sec)
限制
MatrixOne 当前不支持使用 VALUES row_constructor_list 参数插入的一组值构成的行。