0

我有两个使用提示的场景IGNORE_ROW_ON_DUPKEY_INDEX。第一个似乎工作正常。第二种情况失败并出现以下错误,我不确定如何修复它。

ORA-38913: Index specified in the index hint is invalid

我正在测试实时 SQL,因此如果您愿意,我们的环境可以相同。

ALTER SESSION SET NLS_DATE_FORMAT = 'MMDDYYYY HH24:MI:SS';

 create table t (
    t_pk integer not null primary key
  );

 insert /*+ IGNORE_ROW_ON_DUPKEY_INDEX (t (t_pk)) */ into t values (1);

insert /*+ IGNORE_ROW_ON_DUPKEY_INDEX (t (t_pk)) */ into t values (1);


CREATE table t1(
      seq_num INTEGER GENERATED BY DEFAULT AS IDENTITY (START WITH 1) NOT NULL,
       a NUMBER,
       b  DATE,
       c NUMBER,
       d NUMBER,
       e DATE,
       f DATE,
       g DATE,
       h VARCHAR2(1),
constraint t1_pk primary key (a, b,c,d,e, f, g,h)
       );

insert /*+ignore_row_on_dupkey_index (t1 ( t1_pk)) */ INTO t1(
       a
       ,b
       ,c
       ,d
       ,e
       ,f
       ,g
       ,h
 )
VALUES
 (1,
TO_DATE('2021-08-28 00:00:00', 'YYYY-MM-DD HH24:MI:SS'),1,1,
TO_DATE('2021-08-28 13:27:00', 'YYYY-MM-DD HH24:MI:SS'),
TO_DATE('2021-08-28 13:30:00', 'YYYY-MM-DD HH24:MI:SS'),
TO_DATE('2021-08-28 13:27:20', 'YYYY-MM-DD HH24:MI:SS'), 'G');
4

1 回答 1

3

第二种情况的语法不正确。给出列列表时的有效语法如下:

/*+ignore_row_on_dupkey_index ( table_name ( column_1, column_2, ... )) */

或者在命名索引时像这样:

/*+ignore_row_on_dupkey_index (table_name , index_name) */

在您的第一个示例中,您将 column 命名为t1_pk,因此( table ( column ))语法是正确的。在您的第二个示例中,您命名了您的contraint t1_pk,因此您需要使用(table,index)语法形式。

请参阅此处的文档:https ://docs.oracle.com/en/database/oracle/oracle-database/12.2/sqlrf/Comments.html#GUID-20390275-91A7-49DC-AAD1-A1FE943A4F75

于 2021-08-28T03:48:12.190 回答