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 子句的更新形式。

以下是各个参数的解释:

  1. INTO: 可选关键字,表示向哪张表插入数据或更新数据。
  2. tbl_name: 表示要插入或更新数据的表的名称。
  3. col_name: 可选参数,表示要插入或更新的列名。在插入形式中,可以通过列名指定要插入的列;在更新形式中,指定要更新的列。
  4. value: 表示要插入或更新的值。可以是具体的表达式(expr)或默认值(DEFAULT)。
  5. value_list: 表示一组要插入的值。多个值之间用逗号分隔。
  6. (暂不支持)row_constructor_list: 表示用于插入的一组值构成的行。每一行的值使用括号括起来,并用逗号分隔。
  7. assignment: 表示一个列名和其对应的值的关联,用于更新形式。
  8. 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 参数插入的一组值构成的行。