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
参数插入的一组值构成的行。