Oracle
 sql >> Baza danych >  >> RDS >> Oracle

PK naruszone w Oracle sql

Opublikowany kod używa składni INSERT ALL do wstawiania wielu wierszy w jednej instrukcji. Próbuje użyć sekwencji NEXTVAL do wygenerowania unikalnego identyfikatora dla każdego wiersza.

dokumentacja jest dość przejrzysta w sprawie funkcjonowania NEXTVAL:

Tak więc każde z tych wywołań NEXTVAL zwróci to samo wartość z sekwencji, więc instrukcja rzuca ORA-00001.

Problem polega na tym, że kod OP niewłaściwie używa składni wielotabelowej wstawiania. Jest przeznaczony do dystrybucji wierszy z jednego zestawu danych źródłowych w kilku tabelach lub warunkowego manipulowania wierszami w jednej tabeli. W obu przypadkach zakłada, że ​​dane źródłowe mają już klucz podstawowy.

Istnieje wiele sposobów obejścia tego problemu, od zakodowania identyfikatora na stałe po użycie wielu instrukcji wstawiania pojedynczej tabeli.

Oto jeden ze sposobów wypełnienia tych tabel opublikowanymi danymi:

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak przechowywać tylko czas; nie data i godzina?

  2. Oracle:operacja arytmetyczna spowodowała przepełnienie

  3. Długie ciągi znaków w N-Hibernate z Oracle powodują błąd

  4. Usuń tabelę z bazy danych Oracle, jeśli tabela istnieje w instrukcji sql

  5. Funkcja odroczonego tworzenia segmentów nie jest włączona (ORA-00439)