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. }
  8. REPLACE
  9. [INTO] tbl_name
  10. SET assignment_list
  11. value:
  12. {expr | DEFAULT}
  13. value_list:
  14. value [, value] ...
  15. row_constructor_list:
  16. ROW(value_list)
  17. assignment:
  18. col_name = value
  19. assignment_list:
  20. 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_listrow_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);
  2. -- 插入一行数据,id=1name="Abby"age=24
  3. replace into names(id, name, age) values(1,"Abby", 24);
  4. mysql> select name, age from names where id = 1;
  5. +------+------+
  6. | name | age |
  7. +------+------+
  8. | Abby | 24 |
  9. +------+------+
  10. 1 row in set (0.00 sec)
  11. mysql> select * from names;
  12. +------+------+------+
  13. | id | name | age |
  14. +------+------+------+
  15. | 1 | Abby | 24 |
  16. +------+------+------+
  17. 1 row in set (0.00 sec)
  18. -- 使用 replace 语句更新 id=1 的记录的 name age 列的值为"Bob" 25
  19. replace into names(id, name, age) values(1,"Bobby", 25);
  20. mysql> select name, age from names where id = 1;
  21. +-------+------+
  22. | name | age |
  23. +-------+------+
  24. | Bobby | 25 |
  25. +-------+------+
  26. 1 row in set (0.00 sec)
  27. mysql> select * from names;
  28. +------+-------+------+
  29. | id | name | age |
  30. +------+-------+------+
  31. | 1 | Bobby | 25 |
  32. +------+-------+------+
  33. 1 row in set (0.01 sec)
  34. -- 使用 replace 语句插入一行数据,id=2name="Ciro"age NULL
  35. replace into names set id = 2, name = "Ciro";
  36. mysql> select name, age from names where id = 2;
  37. +------+------+
  38. | name | age |
  39. +------+------+
  40. | Ciro | NULL |
  41. +------+------+
  42. 1 row in set (0.01 sec)
  43. mysql> select * from names;
  44. +------+-------+------+
  45. | id | name | age |
  46. +------+-------+------+
  47. | 1 | Bobby | 25 |
  48. | 2 | Ciro | NULL |
  49. +------+-------+------+
  50. 2 rows in set (0.00 sec)
  51. -- 使用 replace 语句更新 id=2 的记录的 name 列的值为 "Ciro"age 列的值为 17
  52. replace into names set id = 2, name = "Ciro", age = 17;
  53. mysql> select name, age from names where id = 2;
  54. +------+------+
  55. | name | age |
  56. +------+------+
  57. | Ciro | 17 |
  58. +------+------+
  59. 1 row in set (0.01 sec)
  60. mysql> select * from names;
  61. +------+-------+------+
  62. | id | name | age |
  63. +------+-------+------+
  64. | 1 | Bobby | 25 |
  65. | 2 | Ciro | 17 |
  66. +------+-------+------+
  67. 2 rows in set (0.01 sec)

限制

MatrixOne 当前不支持使用 VALUES row_constructor_list 参数插入的一组值构成的行。