En unik begrænsning håndhæver, ja, unikhed. Det vil tillade nuller i modsætning til en primær nøglebegrænsning .
Din fejl betyder, at du indsætter duplikerede data, når databasen er konfigureret til eksplicit at forbyde det.
Du kan finde ud af, hvilke begrænsninger der er på en tabel ved at køre følgende forespørgsel på alle_begrænsninger
. Linket afkoder kolonnen CONSTRAINT_TYPE
, for eksempel P
er en primær nøgle og U
en unik nøgle.
select *
from all_constraints uc
where uc.table_name = 'MY_TABLE'
and owner = 'DBSCHEMA'
For at finde ud af, hvilke kolonner der er i en begrænsning, brug >all_cons_columns
i stedet, eller ved at kombinere de to til én forespørgsel:
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'
Til begge forespørgsler kan du tilføje den ekstra betingelse and constraint_name = 'IDX_CO_DETAILS'
for at finde ud af detaljer om den specifikke begrænsning, der ser ud til at forårsage dit problem.
Din kommentar er lidt overraskende af et par grunde. Selv en systemskabt begrænsning, for eksempel en, der blev defineret in-line, da tabellen blev oprettet uden at et navn er angivet, skulle dukke op. Også begrænsningsnavnet IDX...
betyder, at det er et indeks.
HVIS du kører følgende forespørgsel, skulle den fortælle dig, om objektet findes i databasen:
select *
from all_objects
where object_name = 'IDX_CO_DETAILS'
Jeg ville forvente, at OBJECT_TYPE
returneret af denne forespørgsel er 'INDEX'
.
Efterfølgende vil følgende forespørgsel returnere hvert indeks med det navn, indekstypen, den tabel det er knyttet til og ejeren af den tabel.
select *
from all_indexes
where index_name = 'IDX_CO_DETAILS'
At dømme efter din fejl vil jeg yderligere forvente, at kolonnen UNIQUNESS
returneret af denne forespørgsel er 'UNIQUE'
.
Dette skulle hjælpe dig med at spore objektet.
Du kan også bruge systempakken dbms_metadata
at spore objektets DDL; pas på det giver en klods tilbage.
select dbms_metadata.get_ddl('INDEX','IDX_CO_DETAILS', schema => 'DBSCHEMA')
from dual
parameteren schema
er valgfrit.