VastbaseG100

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

Menu

INSERT IGNORE

功能描述

Vastbase G100在MySQL兼容模式下,支持在INSERT语句中使用IGNORE选项。

用户在执行INSERT语句的时候,如果发生主键或唯一索引冲突,SQL语句是会引发ERROR报错,如果使用IGNORE选项,则忽略在执行SQL语句时发生的可忽略的错误,将Error降级为Warning,且继续语句的执行,不会影响其他数据的操作。能使Error降级的场景有:

1、违反非空约束时:

若执行的SQL语句违反了表的非空约束,使用IGNORE选项可将Error降级为Warning,并根据GUC参数sql_ignore_strategy的值采用以下策略的一种继续执行:

  • sql_ignore_strategy为ignore_null时,忽略违反非空约束的行的INSERT操作,并继续执行剩余数据操作。
  • sql_ignore_strategy为overwrite_null时,将违反约束的null值覆写为目标类型的默认值,并继续执行剩余数据操作。

GUC参数sql_ignore_strategy相关信息请参考sql_ignore_strategy

2、违反唯一约束时:

若执行的SQL语句违反了表的唯一约束,使用IGNORE选项可将Error降级为Warning,忽略违反约束的行的INSERT操作,并继续执行剩余数据操作。

3、分区表无法匹配到合法分区时:

在对分区表进行INSERT操作时,若某行数据无法匹配到表格的合法分区,使用IGNORE选项可将Error降级为Warning,忽略该行操作,并继续执行剩余数据操作。

4、插入值向目标列类型转换失败时:

执行INSERT语句时,若发现新值与目标列类型不匹配,使用IGNORE选项可将Error降级为Warning,并根据新值与目标列的具体类型采取以下策略的一种继续执行:

  • 当新值类型与列类型同为数值类型时:

    若新值在列类型的范围内,则直接进行插入;若新值在列类型范围外,则以列类型的最大/最小值替代。

  • 当新值类型与列类型同为字符串类型时:

    若新值长度在列类型限定范围内,则以直接进行插入;若新值长度在列类型的限定范围外,则保留列类型长度限制的前n个字符。

  • 若遇到新值类型与列类型不可转换时:

    插入列类型的默认值。

例如,如果没有IGNORE,表中现有主键或唯一索引重复将会导致重复键错误,并且语句将中止。使用IGNORE选项,该行将被丢弃并且不会发生错误,忽略的错误会生成警告。

其它关于INSERT的相关内容请参考INSERT

语法格式

INSERT [/*+ plan_hint */] [IGNORE] INTO table_name ...

参数说明

  • IGNORE

    使用该参数,如果发生了主键或唯一索引冲突,则会忽略错误并发出一个WARNING。

  • table_name

    表名。

注意事项

  • 该功能仅在数据库兼容模式为MySQL时能够使用(即创建DB时DBCOMPATIBILITY='B'),在其他数据库兼容模式下不能使用该特性。
  • IGNORE支持分区表。

示例

前置步骤:创建兼容模式为MySQL的库db_mysql,并进入。

create  database  db_mysql  dbcompatibility  'B';
\c  db_mysql

1、创建一张测试表,主键id。

 CREATE TABLE table_name(
  id int NOT NULL,
  name varchar(50) DEFAULT NULL,
  age int DEFAULT NULL,
  PRIMARY KEY (id)
);

2、插入一条数据。

 insert into table_name values(1,'tom', 20);

3、插入一条数据,id为1,不加ignore(主键冲突)。

 insert into table_name values(1,'Bill',21);

返回结果如下,报主键冲突的错误:

ERROR:  duplicate key value violates unique constraint "table_name_pkey"
DETAIL:  Key (id)=(1) already exists.

4、加上ignore之后插入数据。

insert ignore into table_name values(1,'Bill',21);

返回结果如下,会有一个WARNING警告:

WARNING:  duplicate key value violates unique constraint in table "table_name"
INSERT 0 0

5、插入多行数据。

 insert ignore into table_name values(1,'Bill',21),(2,'cim',21);

返回结果为:

WARNING:  duplicate key value violates unique constraint in table "table_name"
INSERT 0 1

6、查询表,发现插入的数据(1,'Bill',21)被忽略了,(2,'cim',21)数据成功插入。

select * from table_name;

返回结果为:

 id | name | age
----+------+-----
  1 | tom  |  20
  2 | cim  |  21
(2 rows)