将部分Error降级为Warning的Hint
该hint不支持列存表,无法在列存表中生效。
使用该hint时,Error会被降级的场景有:
违反非空约束时
若执行的SQL语句违反了表的非空约束,使用此hint可将Error降级为Warning,并根据GUC参数sql_ignore_strategy的值采用以下策略的一种继续执行:
sql_ignore_startegy为ignore_null时,忽略违反非空约束的行的INSERT/UPDATE操作,并继续执行剩余数据操作。
-
说明:
GUC参数sql_ignore_strategy相关信息请参考。
违反唯一约束时
若执行的SQL语句违反了表的唯一约束,使用此hint可将Error降级为Warning,忽略违反约束的行的INSERT/UPDATE操作,并继续执行剩余数据操作。
分区表无法匹配到合法分区时
在对分区表进行INSERT/UPDATE操作时,若某行数据无法匹配到表格的合法分区,使用此hint可将Error降级为Warning,忽略该行操作,并继续执行剩余数据操作。
更新/插入值向目标列类型转换失败时
当新值类型与列类型同为数值类型时:
若新值在列类型的范围内,则直接进行插入/更新;若新值在列类型范围外,则以列类型的最大/最小值替代。
当新值类型与列类型同为字符串类型时:
若新值长度在列类型限定范围内,则以直接进行插入/更新;若新值长度在列类型的限定范围外,则保留列类型长度限制的前n个字符。
若遇到新值类型与列类型不可转换时:
插入/更新列类型的默认值。
为使用ignore_error hint,需要创建B兼容模式的数据库,名称为db_ignore。
\c db_ignore
- 忽略非空约束
- 忽略唯一约束
db_ignore=# create table t_unique(num int unique);
NOTICE: CREATE TABLE / UNIQUE will create implicit index "t_unique_num_key" for table "t_unique"
CREATE TABLE
db_ignore=# insert into t_unique values(1);
INSERT 0 1
WARNING: duplicate key value violates unique constraint in table "t_unique"
INSERT 0 1
db_ignore=# select * from t_unique;
num
-----
1
2
(2 rows)
WARNING: duplicate key value violates unique constraint in table "t_unique"
UPDATE 0
db_ignore=# select * from t_unique ;
num
-----
1
2
(2 rows)
- 忽略分区表无法匹配到合法分区
- 更新/插入值向目标列类型转换失败
-- 当新值类型与列类型同为数值类型
CREATE TABLE
db_ignore=# insert /*+ ignore_error */ into t_tinyint values(10000);
WARNING: tinyint out of range
CONTEXT: referenced column: num
INSERT 0 1
db_ignore=# select * from t_tinyint;
-----
255
(1 row)
-- 当新值类型与列类型同为字符类型时
db_ignore=# create table t_varchar5(content varchar(5));
CREATE TABLE
db_ignore=# insert /*+ ignore_error */ into t_varchar5 values('abcdefghi');
WARNING: value too long for type character varying(5)
CONTEXT: referenced column: content
INSERT 0 1
db_ignore=# select * from t_varchar5 ;
content
---------
(1 row)