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

PK krænket i oracle sql

Den udsendte kode bruger INSERT ALL-syntaksen til at indsætte flere rækker i en enkelt sætning. Den forsøger at bruge sekvensen NEXTVAL til at generere en unik identifikator for hver række.

dokumentationen er ret klar om NEXTVAL's funktion:

Så hvert af disse opkald til NEXTVAL vil returnere det samme værdi fra sekvensen, og sætningen kaster derfor ORA-00001.

Problemet er, at OP'ens kode misbruger syntaksen for multitableindsætning. Det er beregnet til at distribuere rækker fra ét sæt kildedata på tværs af flere tabeller eller betinget manipulere rækkerne til én tabel. I begge tilfælde antager det, at kildedataene allerede har en primær nøgle.

Der er forskellige måder at løse dette på, lige fra hardkodning af ID'et til brug af flere enkelt tabelindsættelsessætninger.

Her er en måde at udfylde disse tabeller med de indsendte data på:

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



  1. Hvordan MID() virker i MariaDB

  2. Fanger fejlmeddelelse fra SQL Server i VBA i Excel

  3. Mysql byte array storage

  4. Forhindrer JDBC-specifikationen '?' fra at blive brugt som operator (uden for anførselstegn)?