Oracle
 sql >> Datenbank >  >> RDS >> Oracle

PK in Oracle SQL verletzt

Der bereitgestellte Code verwendet die INSERT ALL-Syntax, um mehrere Zeilen in eine einzelne Anweisung einzufügen. Es versucht, die Sequenz NEXTVAL zu verwenden, um eine eindeutige Kennung für jede Zeile zu generieren.

Die Dokumentation ist ziemlich klar zur Funktionsweise von NEXTVAL:

Jeder dieser Aufrufe von NEXTVAL gibt also dasselbe zurück Wert aus der Sequenz, und so schleudert die Anweisung ORA-00001.

Das Problem ist, dass der Code des OP die Syntax zum Einfügen mehrerer Tabellen missbraucht. Es ist beabsichtigt, Zeilen aus einem Satz von Quelldaten auf mehrere Tabellen zu verteilen oder die Zeilen bedingt in eine Tabelle zu manipulieren. In beiden Fällen wird davon ausgegangen, dass die Quelldaten bereits einen Primärschlüssel haben.

Es gibt verschiedene Möglichkeiten, dies zu umgehen, von der Hardcodierung der ID bis zur Verwendung mehrerer Einfügeanweisungen für einzelne Tabellen.

Hier ist eine Möglichkeit, diese Tabellen mit den geposteten Daten zu füllen:

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 
    )
/