VastbaseG100

基于openGauss内核开发的企业级关系型数据库。

Menu

REPLACE INTO

功能描述

replace是MySQL的一个扩展语法,它的工作原理与insert几乎相同,不同点在于表中存在唯一性约束时,replace into先删除冲突行,再插入新行。

注意事项

  • 该功能仅在数据库兼容模式为MySQL时支持(即数据库实例初始化时指定DBCOMPATIBILITY='B')。

  • 在使用replace语句时,用户必须对操作的表(客体)具有insert和delete权限。

  • 不能将要做replace操作的表通过子查询语句的形式,作为replace操作的目标值,例如以下写法是错误的:

    REPLACE INTO test VALUES (1, 'Old', select aTime from test where id =2;
    

语法格式

REPLACE  [INTO]  table_name  VALUES   …
REPLACE  [INTO]  table_name  VALUE  {expr  |  DEFAULT}   …
REPLACE  [INTO]  table_name  SET  col_name  =  value  [,  col_name  =  value  ] …
REPLACE  [INTO]  table_name  SELECT …

参数说明

  • table_name:

    表名。必须是已存在的表。

  • col_name

    列名。

  • expr

    赋予对应column的一个有效表达式或值:

  • DEFAULT

    对应字段名的缺省值。如果没有缺省值,则为NULL。

示例

1、创建一张表,并指定主键。

CREATE TABLE test (
id int,
id2 int,
name varchar(50) DEFAULT NULL,
PRIMARY KEY(id)
);

2、插入测试数据。

replace test  values(1,1000,'test1');
replace test  values(2,2000,'test2');
replace test  values(3,3000,'test3');
replace test  values(4,4000,'test4');

3、查询测试表数据。

select * from test;

结果返回如下:

 id | id2  | name
----+------+-------
  1 | 1000 | test1
  2 | 2000 | test2
  3 | 3000 | test3
  4 | 4000 | test4
(4 rows)

4、执行replace 操作的数据,会与主键产生冲突。

replace test  values(1,4000,'test5');

5、查询ID为1数据是否被替换。

select * from test;

当结果显示如下信息,则表示替换成功。

 id | id2  | name  
----+------+-------
  2 | 2000 | test2
  3 | 3000 | test3
  4 | 4000 | test4
  1 | 4000 | test5
(4 rows)

如果表包含多个唯一索引,并且新行在不同的唯一索引中重复了不同旧行的值,则replace的单行可能出现替换多个旧行的结果(新插入一行,删除了多行)。