将部分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。

    1. \c db_ignore
    • 忽略非空约束
    • 忽略唯一约束
    1. db_ignore=# create table t_unique(num int unique);
    2. NOTICE: CREATE TABLE / UNIQUE will create implicit index "t_unique_num_key" for table "t_unique"
    3. CREATE TABLE
    4. db_ignore=# insert into t_unique values(1);
    5. INSERT 0 1
    6. WARNING: duplicate key value violates unique constraint in table "t_unique"
    7. INSERT 0 1
    8. db_ignore=# select * from t_unique;
    9. num
    10. -----
    11. 1
    12. 2
    13. (2 rows)
    14. WARNING: duplicate key value violates unique constraint in table "t_unique"
    15. UPDATE 0
    16. db_ignore=# select * from t_unique ;
    17. num
    18. -----
    19. 1
    20. 2
    21. (2 rows)
    • 忽略分区表无法匹配到合法分区
    • 更新/插入值向目标列类型转换失败
    1. -- 当新值类型与列类型同为数值类型
    2. CREATE TABLE
    3. db_ignore=# insert /*+ ignore_error */ into t_tinyint values(10000);
    4. WARNING: tinyint out of range
    5. CONTEXT: referenced column: num
    6. INSERT 0 1
    7. db_ignore=# select * from t_tinyint;
    8. -----
    9. 255
    10. (1 row)
    11. -- 当新值类型与列类型同为字符类型时
    12. db_ignore=# create table t_varchar5(content varchar(5));
    13. CREATE TABLE
    14. db_ignore=# insert /*+ ignore_error */ into t_varchar5 values('abcdefghi');
    15. WARNING: value too long for type character varying(5)
    16. CONTEXT: referenced column: content
    17. INSERT 0 1
    18. db_ignore=# select * from t_varchar5 ;
    19. content
    20. ---------
    21. (1 row)