#sql #oracle #query-hints
Вопрос:
У меня есть 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');
Ответ №1:
Ваш синтаксис для второго случая неверен. Допустимый синтаксис при задании списка столбцов выглядит следующим образом:
/* ignore_row_on_dupkey_index ( table_name ( column_1, column_2, ... )) */
или вот так при названии индекса:
/* ignore_row_on_dupkey_index (table_name , index_name) */
В вашем первом примере вы назвали свой столбец t1_pk
, поэтому ( table ( column ))
синтаксис правильный. Во втором примере вы назвали свое противопоказание t1_pk
, поэтому вам нужно использовать (table,index)
синтаксическую форму.
Смотрите документацию здесь: https://docs.oracle.com/en/database/oracle/oracle-database/12.2/sqlrf/Comments.html#GUID-20390275-91A7-49DC-AAD1-A1FE943A4F75