уникално ограничение налага, добре, уникалност. Той ще позволи нули, за разлика от ограничение за първичен ключ .
Вашата грешка означава, че вмъквате дублиращи се данни, когато базата данни е конфигурирана изрично да забранява това.
Можете да разберете какви ограничения има върху таблица, като изпълните следната заявка на всички_ограничения
. Връзката декодира колоната CONSTRAINT_TYPE
, например P
е първичен ключ и U
уникален ключ.
select *
from all_constraints uc
where uc.table_name = 'MY_TABLE'
and owner = 'DBSCHEMA'
За да разберете какви колони има в ограничение, използвайте all_cons_columns
вместо това или комбиниране на двете в една заявка:
select uc.*, ucc.column_name, ucc.position
from all_constraints uc
join all_cons_columns ucc
on uc.owner = ucc.owner
and uc.table_name = ucc.table_name
and uc.constraint_name = ucc.constraint_name
where uc.table_name = 'MY_TABLE'
and uc.owner = 'DBSCHEMA'
Към всяка заявка можете да добавите допълнителното условие and constraint_name = 'IDX_CO_DETAILS'
за да разберете подробности за конкретното ограничение, което изглежда причинява проблема ви.
Вашият коментар е малко изненадващ поради няколко причини. Дори ограничение, създадено от системата, например такова, което е дефинирано в ред при създаването на таблицата, без да е посочено име, трябва да се покаже. Освен това името на ограничението IDX...
означава, че това е индекс.
АКО изпълните следната заявка, тя трябва да ви каже дали обектът съществува в базата данни:
select *
from all_objects
where object_name = 'IDX_CO_DETAILS'
Очаквам, че OBJECT_TYPE
върнат от тази заявка е 'INDEX'
.
Следвайки това, следната заявка ще върне всеки индекс с това име, типа на индекса, таблицата, с която е свързан, и собственика на тази таблица.
select *
from all_indexes
where index_name = 'IDX_CO_DETAILS'
Съдейки по вашата грешка, бих очаквал допълнително, че колоната UNIQUNESS
върнато от тази заявка е 'UNIQUE'
.
Това трябва да ви помогне да проследите обекта.
Можете също да използвате системния пакет dbms_metadata
за проследяване на DDL на обекта; внимавайте, че връща буца.
select dbms_metadata.get_ddl('INDEX','IDX_CO_DETAILS', schema => 'DBSCHEMA')
from dual
параметърът schema
не е задължително.