REPLACE
语法描述
REPLACE 不仅是一个字符串函数,还是一个替换操作的数据操作语句。REPLACE 语句的作用是向表中插入数据,如果表中已经存在符合条件的记录,则会先删除该记录,然后再插入新的数据。如果表中不存在符合条件的记录,则直接插入新的数据。
REPLACE 通常在具有唯一约束的表中使用。
REPLACE语句要求表中必须存在主键或唯一索引,用于判断是否已经存在相同的记录。- 使用
REPLACE语句插入新记录时,如果已经存在相同主键或唯一索引的记录,旧记录将被删除,然后插入新记录,这可能导致自增列的值发生变化。
语法结构
1. REPLACE
2. [INTO] tbl_name
3. [(col_name [, col_name] ...)]
4. { VALUES(value_list)
5. |
6. VALUES row_constructor_list
7. }
9. REPLACE
10. [INTO] tbl_name
11. SET assignment_list
13. value:
14. {expr | DEFAULT}
16. value_list:
17. value [, value] ...
19. row_constructor_list:
20. ROW(value_list)
22. assignment:
23. col_name = value
25. assignment_list:
26. 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来指定要更新的列和对应的值。
示例
1. create table names(id int PRIMARY KEY,name VARCHAR(255),age int);
3. -- 插入一行数据,id=1,name="Abby",age=24
4. replace into names(id, name, age) values(1,"Abby", 24);
5. mysql> select name, age from names where id = 1;
6. +------+------+
7. | name | age |
8. +------+------+
9. | Abby | 24 |
10. +------+------+
11. 1 row in set (0.00 sec)
13. mysql> select * from names;
14. +------+------+------+
15. | id | name | age |
16. +------+------+------+
17. | 1 | Abby | 24 |
18. +------+------+------+
19. 1 row in set (0.00 sec)
21. -- 使用 replace 语句更新 id=1 的记录的 name 和 age 列的值为"Bob"和 25
22. replace into names(id, name, age) values(1,"Bobby", 25);
24. mysql> select name, age from names where id = 1;
25. +-------+------+
26. | name | age |
27. +-------+------+
28. | Bobby | 25 |
29. +-------+------+
30. 1 row in set (0.00 sec)
32. mysql> select * from names;
33. +------+-------+------+
34. | id | name | age |
35. +------+-------+------+
36. | 1 | Bobby | 25 |
37. +------+-------+------+
38. 1 row in set (0.01 sec)
40. -- 使用 replace 语句插入一行数据,id=2,name="Ciro",age 为 NULL
41. replace into names set id = 2, name = "Ciro";
43. mysql> select name, age from names where id = 2;
44. +------+------+
45. | name | age |
46. +------+------+
47. | Ciro | NULL |
48. +------+------+
49. 1 row in set (0.01 sec)
51. mysql> select * from names;
52. +------+-------+------+
53. | id | name | age |
54. +------+-------+------+
55. | 1 | Bobby | 25 |
56. | 2 | Ciro | NULL |
57. +------+-------+------+
58. 2 rows in set (0.00 sec)
60. -- 使用 replace 语句更新 id=2 的记录的 name 列的值为 "Ciro",age 列的值为 17
61. replace into names set id = 2, name = "Ciro", age = 17;
63. mysql> select name, age from names where id = 2;
64. +------+------+
65. | name | age |
66. +------+------+
67. | Ciro | 17 |
68. +------+------+
69. 1 row in set (0.01 sec)
71. mysql> select * from names;
72. +------+-------+------+
73. | id | name | age |
74. +------+-------+------+
75. | 1 | Bobby | 25 |
76. | 2 | Ciro | 17 |
77. +------+-------+------+
78. 2 rows in set (0.01 sec)
限制
MatrixOne 当前不支持使用 VALUES row_constructor_list 参数插入的一组值构成的行。
