索引提示中指定的 Oracle 索引无效
Oracle index specified in index hint is invalid
我有 2 个使用提示的场景 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');
第二种情况的语法不正确。给出列列表时的有效语法如下:
/*+ignore_row_on_dupkey_index ( table_name ( column_1, column_2, ... )) */
或者在命名索引时像这样:
/*+ignore_row_on_dupkey_index (table_name , index_name) */
在您的第一个示例中,您将列命名为 t1_pk
,因此 ( table ( column ))
语法是正确的。在您的第二个示例中,您将 contraint t1_pk
命名为 t1_pk
,因此您需要使用 (table,index)
语法形式。
我有 2 个使用提示的场景 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');
第二种情况的语法不正确。给出列列表时的有效语法如下:
/*+ignore_row_on_dupkey_index ( table_name ( column_1, column_2, ... )) */
或者在命名索引时像这样:
/*+ignore_row_on_dupkey_index (table_name , index_name) */
在您的第一个示例中,您将列命名为 t1_pk
,因此 ( table ( column ))
语法是正确的。在您的第二个示例中,您将 contraint t1_pk
命名为 t1_pk
,因此您需要使用 (table,index)
语法形式。