sql >> Database >  >> RDS >> Oracle

PK geschonden in orakel sql

De geposte code gebruikt de syntaxis INSERT ALL om meerdere rijen in een enkele instructie in te voegen. Het probeert de reeks NEXTVAL te gebruiken om een ​​unieke identificatie voor elke rij te genereren.

De documentatie is vrij duidelijk over de werking van NEXTVAL:

Dus elk van die oproepen naar NEXTVAL levert dezelfde . op waarde uit de reeks, en dus slingert de instructie ORA-00001.

Het probleem is dat de OP-code de syntaxis van meerdere tabellen misbruikt. Het is bedoeld om rijen uit één set brongegevens over meerdere tabellen te verdelen, of om de rijen voorwaardelijk in één tabel te manipuleren. In beide gevallen wordt ervan uitgegaan dat de brongegevens al een primaire sleutel hebben.

Er zijn verschillende manieren om dit te omzeilen, van het hardcoderen van de ID tot het gebruik van meerdere invoeginstructies voor een enkele tabel.

Hier is een manier om deze tabellen te vullen met de geposte gegevens:

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. SQL-berichtentabelquery

  2. Krijg maandnaam van nummer in PostgreSQL

  3. Google Docs als database gebruiken?

  4. Oracle vervangt asterisk voor alle kolommen in een weergave