En unik begränsning framtvingar, ja, unikhet. Det kommer att tillåta nollor, till skillnad från en primärnyckelbegränsning .
Ditt fel innebär att du infogar dubblettdata när databasen har konfigurerats för att uttryckligen förbjuda det.
Du kan ta reda på vilka begränsningar som finns i en tabell genom att köra följande fråga på alla_begränsningar
. Länken avkodar kolumnen CONSTRAINT_TYPE
, till exempel P
är en primärnyckel och U
en unik nyckel.
select *
from all_constraints uc
where uc.table_name = 'MY_TABLE'
and owner = 'DBSCHEMA'
För att ta reda på vilka kolumner som finns i en begränsning, använd >all_cons_columns
istället, eller kombinera de två till en fråga:
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'
Till båda frågorna kan du lägga till det ytterligare villkoret and constraint_name = 'IDX_CO_DETAILS'
för att ta reda på detaljer om den specifika begränsningen som verkar orsaka ditt problem.
Din kommentar är lite förvånande av ett par anledningar. Även ett system skapat begränsning, till exempel en som definierades in-line när tabellen skapades utan att ett namn specificerats bör dyka upp. Även begränsningsnamnet IDX...
antyder att det är ett index.
OM du kör följande fråga bör den tala om för dig om objektet finns i databasen:
select *
from all_objects
where object_name = 'IDX_CO_DETAILS'
Jag förväntar mig att OBJECT_TYPE
returneras av denna fråga är 'INDEX'
.
Efter det kommer följande fråga att returnera varje index med det namnet, typen av index, tabellen den är associerad med och ägaren till den tabellen.
select *
from all_indexes
where index_name = 'IDX_CO_DETAILS'
Att döma av ditt fel skulle jag förvänta mig att kolumnen UNIQUNESS
returneras av denna fråga är 'UNIQUE'
.
Detta bör hjälpa dig att spåra objektet.
Du kan också använda systempaketet dbms_metadata
att spåra objektets DDL; var försiktig, det ger en klump.
select dbms_metadata.get_ddl('INDEX','IDX_CO_DETAILS', schema => 'DBSCHEMA')
from dual
parametern schema
är valfritt.