Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

PK dilanggar di Oracle sql

Kode yang diposting menggunakan sintaks INSERT ALL untuk menyisipkan beberapa baris dalam satu pernyataan. Ini mencoba menggunakan urutan NEXTVAL untuk menghasilkan pengidentifikasi unik untuk setiap baris.

dokumentasi cukup jelas tentang fungsi NEXTVAL:

Jadi setiap panggilan ke NEXTVAL akan mengembalikan sama nilai dari urutan, dan pernyataan melemparkan ORA-00001.

Masalahnya adalah kode OP menyalahgunakan sintaks penyisipan multi-tabel. Ini dimaksudkan untuk mendistribusikan baris dari satu set data sumber di beberapa tabel, atau memanipulasi baris secara kondisional menjadi satu tabel. Dalam kedua kasus itu mengasumsikan data sumber sudah memiliki kunci utama.

Ada berbagai cara untuk mengatasi hal ini, mulai dari hardcoding ID hingga menggunakan beberapa pernyataan penyisipan tabel tunggal.

Berikut adalah salah satu cara untuk mengisi tabel ini dengan data yang diposting:

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. BatchUpdateException:batch tidak akan dihentikan

  2. Operator Oracle MINUS Dijelaskan

  3. Oracle Cloud Breakdown – Biaya Hosting Database di OCI

  4. Apakah Oracle menyimpan angka nol untuk tipe data Number?

  5. Bagaimana cara melakukan join kiri dalam Bahasa Kueri Hibernasi?