sql >> Databáze >  >> RDS >> Oracle

PK porušena v oracle sql

Odeslaný kód používá syntaxi INSERT ALL k vložení více řádků do jednoho příkazu. Pokusí se použít sekvenci NEXTVAL k vygenerování jedinečného identifikátoru pro každý řádek.

dokumentace je zcela jasná o fungování NEXTVAL:

Takže každé z těchto volání NEXTVAL vrátí stejné hodnotu ze sekvence, a tak příkaz vrhne ORA-00001.

Problém je v tom, že kód OP zneužívá syntaxi vkládání více tabulek. Je určen k distribuci řádků z jedné sady zdrojových dat do několika tabulek nebo podmíněné manipulaci s řádky do jedné tabulky. V obou případech předpokládá, že zdrojová data již mají primární klíč.

Existují různé způsoby, jak to obejít, od pevného kódování ID až po použití více příkazů pro vložení jedné tabulky.

Zde je jeden způsob, jak naplnit tyto tabulky odeslanými daty:

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. Kde A=1 AND A=2 vrátí problém s 0 řádky - (Krátká otázka Mysql)

  2. Jak mohu spočítat online uživatele ve své aplikaci?

  3. Jak zjistím, kdy je vyplnění fulltextového indexu SQL dokončeno?

  4. Nejnovější datum a čas z jedinečného indexu mysql