sql >> Databasteknik >  >> RDS >> Oracle

Undantag för överträdelse av begränsningar ORA-00001

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.




  1. Hitta det lägsta oanvända värdet i mysql-tabellen

  2. PHP/HTML Lägg till En borttagningsknapp

  3. Skala PostgreSQL med Connection Poolers &Load Balancers

  4. Infogar datumvärde i MySQL via PHP