REPLACE
功能描述
在表中插入或者替换新的数据。当插入的数据与原有数据存在主键/唯一键冲突时,执行REPLACE语句会先删除原有数据,再插入新的数据。
REPLACE语句有三种形式:
- 第一种是值插入,即构造一行记录并插入到表中。
- 第二种形式是查询插入,它通过SELECT子句返回的结果集构造一行或多行记录插入到表中。
- 第三种是设定指定字段值,与值插入类似,对于没有指定的列取其默认值。
注意事项
- 执行该语句的用户需要有表的DELETE和INSERT权限。
- 主键不冲突的情况下直接插入;对于主键冲突的记录,先删除再插入;affected row为1时是直接插入,为2时是先删再插入。
- REPLACE事务提交是默认关闭的。会话退出时,需要显式COMMIT,否则记录将丢失。
- REPLACE...SELECT形式,select_list列数必须与待插入的字段数一样。
- REPLACE...SET语法中,若col_name无默认值,则SET col_name = col_name + 1等同于col_name = NULL;若col_name有默认值,则SET col_name = col_name + 1等同于 SET col_name = (col_name的默认值) + 1。
语法格式
- 值替换。
REPLACE [hint_info] [ INTO ] [ schema_name. ]table_name [ ( column_name [ , ... ] ) ] VALUES ( expression [ , ... ] )
- 查询替换。
REPLACE [ INTO ] [ schema_name. ]table_name [table_alais][ ( column_name [ , ... ] ) ]select_clause
- select_clause
SELECT [ DISTINCT ] select_list FROM table_list [ where_clause ] [ group_by_clause ] [ order_by_clause ] [ limit_clause ]
- 表达式设置替换。
REPLACE [ INTO ] [ schema_name. ]table_name SET {column_name = expression} [ , ... ]
参数说明
- table_name
待插入的表名。
- column_name
待插入的表字段名。
如果insert语句所指定的字段名包含表中的所有字段,则可以省略字段名。
取值范围:已存在的字段名。
- expression
插入字段的值或表达式。
- select_clause
SELECT查询结果集作为新值插入到表中,具体参数,参考select章节。
- select_list
指定查询列。
- table_list
指定查询表,可以是表、视图、子查询。
- DISTINCT
关键字,表示查询结果集是否需要去重。
取值范围:已存在的字段名,或字段表达式。
- where_clause
指定查询结果集要满足的条件。
- group_by_clause
指定查询结果集要满足的分组规则。
- order_by_clause
指定查询结果集要满足的排序规则。
- limit_clause
指定查询结果集要满足的界限。
示例
--删除表training。 DROP TABLE IF EXISTS training;
--创建表training。 CREATE TABLE training(staff_id INT PRIMARY KEY,course_name CHAR(50),course_start_date DATETIME, course_end_date DATETIME,exam_date DATETIME,score INT);
--向表training中插入记录1。 REPLACE INTO training(staff_id,course_name,course_start_date,course_end_date,exam_date,score) VALUES(10,'SQL majorization','2017-06-15 12:00:00','2017-06-20 12:00:00','2017-06-25 12:00:00',90); --向表training中替换记录1。 REPLACE INTO training(staff_id,course_name,course_start_date,course_end_date,exam_date,score) VALUES(10,'information safety','2017-06-20 12:00:00','2017-06-25 12:00:00','2017-06-26 12:00:00',95); --使用REPLACE...SELECT向表training中替换记录1。 REPLACE INTO training(staff_id,course_name,course_start_date,course_end_date,exam_date,score) select 10,'master all kinds of thinking methonds','2017-07-15 12:00:00','2017-07-20 12:00:00','2017-07-25 12:00:00',97 from SYS_DUMMY; --使用SET向表training中插入记录2。 REPLACE /*+ nologging*/ INTO training SET staff_id = 11,course_name = 'information technology', course_start_date = '2017-07-20 12:00:00', course_end_date = '2017-07-25 12:00:00',exam_date = '2017-07-26 12:00:00',score = 95; --提交事务。 COMMIT;
「喜欢文章,快来给作者赞赏墨值吧」【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。评论
- 表达式设置替换。
- 查询替换。