unikalne ograniczenie wymusza, no cóż, wyjątkowość. Zezwala na wartości null, w przeciwieństwie do ograniczenia klucza podstawowego .
Twój błąd oznacza, że wstawiasz zduplikowane dane, gdy baza danych została skonfigurowana tak, aby wyraźnie tego zabronić.
Możesz dowiedzieć się, jakie ograniczenia znajdują się w tabeli, uruchamiając następujące zapytanie na wszystkie_ograniczenia
. Link dekoduje kolumnę CONSTRAINT_TYPE
, na przykład P
jest kluczem podstawowym, a U
unikalny klucz.
select *
from all_constraints uc
where uc.table_name = 'MY_TABLE'
and owner = 'DBSCHEMA'
Aby dowiedzieć się, jakie kolumny są objęte ograniczeniem, użyj all_cons_columns
zamiast tego lub łącząc je w jedno zapytanie:
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'
Do obu zapytań możesz dodać dodatkowy warunek and constraint_name = 'IDX_CO_DETAILS'
aby poznać szczegóły konkretnego ograniczenia, które wydaje się być przyczyną Twojego problemu.
Twój komentarz jest nieco zaskakujący z kilku powodów. Powinno pojawić się nawet ograniczenie utworzone przez system, na przykład takie, które zostało zdefiniowane w linii podczas tworzenia tabeli bez określenia nazwy. Ponadto nazwa ograniczenia IDX...
oznacza, że jest to indeks.
JEŚLI uruchomisz następujące zapytanie, powinno ono powiedzieć, czy obiekt istnieje w bazie danych:
select *
from all_objects
where object_name = 'IDX_CO_DETAILS'
Spodziewam się, że OBJECT_TYPE
zwrócone przez to zapytanie to 'INDEX'
.
Następnie następujące zapytanie zwróci każdy indeks o tej nazwie, typ indeksu, tabelę, z którą jest powiązany i właściciela tej tabeli.
select *
from all_indexes
where index_name = 'IDX_CO_DETAILS'
Sądząc po twoim błędzie, spodziewałbym się dalej, że kolumna UNIQUNESS
zwrócone przez to zapytanie to 'UNIQUE'
.
Powinno to pomóc w wyśledzeniu obiektu.
Możesz także użyć pakietu systemowego dbms_metadata
wyśledzić DDL obiektu; uważaj, że zwraca kloba.
select dbms_metadata.get_ddl('INDEX','IDX_CO_DETAILS', schema => 'DBSCHEMA')
from dual
parametr schema
jest opcjonalne.