Oracle
 sql >> Database >  >> RDS >> Oracle

PK violato in Oracle sql

Il codice pubblicato utilizza la sintassi INSERT ALL per inserire più righe in una singola istruzione. Tenta di utilizzare la sequenza NEXTVAL per generare un identificatore univoco per ogni riga.

La documentazione è abbastanza chiara sul funzionamento di NEXTVAL:

Quindi ciascuna di queste chiamate a NEXTVAL restituirà lo uguale valore dalla sequenza, e quindi l'istruzione lancia ORA-00001.

Il problema è che il codice dell'OP sta abusando della sintassi di inserimento multi-tabella. Ha lo scopo di distribuire righe da un set di dati di origine su più tabelle o manipolare condizionalmente le righe in una tabella. In entrambi i casi presuppone che i dati di origine abbiano già una chiave primaria.

Esistono vari modi per aggirare questo problema, dall'hardcoding dell'ID all'utilizzo di più istruzioni di inserimento di tabelle singole.

Ecco un modo per popolare queste tabelle con i dati pubblicati:

insert into athlete (athlete_no, athlete_name, athlete_birthdate, athlete_birthplace, athlete_born_country, athlete_gender, athlete_height, athlete_weight, athlete_team_country)
select athlete_no_seq.nextval , nm, dt, pl, ctry, gn, ht, wt, tm
from (
    select 'Michael Phelps' nm, to_date('1985-06-30','yyyy-mm-dd') dt, 'Towson' pl, 'USA' ctry, 'M' gn, 193 ht, 88 wt, 'USA' tm from dual union all
    select 'Stephanie Rice', to_date('1988-06-17','yyyy-mm-dd'), 'Brisbane', 'AUS', 'F', 176, 67, 'AUS' from dual union all
    select 'Rebecca Adlington', to_date('1989-02-17','yyyy-mm-dd'), 'Mansfield', 'GBR', 'F', 179, 870, 'GBR' from dual union all
    select 'Lee Chong Wei', to_date('1982-10-21','yyyy-mm-dd'), 'Perak', 'MAS', 'M', 170, 60, 'MAS' from dual union all
    select 'Lin Dan', to_date('1983-10-14','yyyy-mm-dd'), 'Fujian', 'CHN', 'M', 176, 68, 'CHN' from dual union all
    select 'Peter Gade', to_date('1976-12-14','yyyy-mm-dd'), 'Aalborg', 'DEN', 'M', 183, 73, 'DEN' from dual
    )
/    

insert into competes (athlete_no, discipline_code, sg_gameno)
select ath.athlete_no, disc.discipline_code, 30
from athlete ath
     cross join discipline disc
where disc.discipline_name = 'Swimming'
/

insert into venue(venue_no, venue_name, venue_location, venue_usedfrom, venueused_to, venue_seatingcapacity, venue_structure, venue_use)
select venue_no_seq.nextval, nm, loc, dtf, dtt, cap, vs, vu
from (
    select 'Aquatics Centre' nm, 'Olympics Park, East London' loc, to_date('2012-07-28','yyyy-mm-dd') dtf, to_date('2012-10-08','yyyy-mm-dd') dtt, 17500 cap, 'N' vs, 'P' vu  from dual union all
    select 'Wembley Arena', 'North West London', to_date('2012-07-28','yyyy-,mm-dd'), to_date('2012-08-05','yyyy-mm-dd'), 6000, 'E', 'P'  from dual 
    )
/