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

Cara Mendefinisikan Kunci Utama Peningkatan Otomatis di Oracle

Banyak yang membuat frustrasi administrator basis data di seluruh dunia, sebelum Oracle versi 12c pada pertengahan 2014, Oracle tidak memiliki kemampuan bawaan untuk secara inheren menghasilkan kolom penambahan otomatis dalam skema tabel. Meskipun alasan untuk keputusan desain ini hanya dapat ditebak, kabar baiknya adalah bahwa bahkan untuk pengguna pada sistem Oracle yang lebih lama, ada solusi yang mungkin untuk mengatasi perangkap ini dan membuat kolom kunci utama yang ditambahkan secara otomatis.

Membuat Urutan

Langkah pertama adalah membuat SEQUENCE di database Anda, yang merupakan objek data yang dapat diakses banyak pengguna untuk secara otomatis menghasilkan nilai yang bertambah. Seperti yang dibahas dalam dokumentasi, urutan di Oracle mencegah nilai duplikat dibuat secara bersamaan karena banyak pengguna secara efektif dipaksa untuk "bergiliran" sebelum setiap item berurutan dibuat.

Untuk tujuan membuat kunci utama unik untuk tabel baru, pertama-tama kita harus CREATE tabel yang akan kita gunakan:

CREATE TABLE books (
  id      NUMBER(10)    NOT NULL,
  title   VARCHAR2(100) NOT NULL
);

Selanjutnya kita perlu menambahkan PRIMARY KEY kendala:

ALTER TABLE books
  ADD (
    CONSTRAINT books_pk PRIMARY KEY (id)
  );

Terakhir, kita akan membuat SEQUENCE yang akan digunakan nanti untuk benar-benar menghasilkan nilai unik yang ditambahkan secara otomatis.

CREATE SEQUENCE books_sequence;

Menambahkan Pemicu

Sementara kami memiliki meja kami dibuat dan siap untuk pergi, urutan kami sejauh ini hanya duduk di sana tetapi tidak pernah digunakan. Di sinilah TRIGGERS masuk.

Mirip dengan event dalam bahasa pemrograman modern, sebuah TRIGGER di Oracle adalah prosedur tersimpan yang dijalankan ketika peristiwa tertentu terjadi.

Biasanya TRIGGER akan dikonfigurasi untuk diaktifkan ketika tabel diperbarui atau catatan dihapus, memberikan sedikit pembersihan bila perlu.

Dalam kasus kami, kami ingin menjalankan TRIGGER kami sebelum INSERT ke dalam books kami tabel, memastikan SEQUENCE our kami bertambah dan nilai baru itu diteruskan ke kolom kunci utama kami.

CREATE OR REPLACE TRIGGER books_on_insert
  BEFORE INSERT ON books
  FOR EACH ROW
BEGIN
  SELECT books_sequence.nextval
  INTO :new.id
  FROM dual;
END;

Di sini kita membuat (atau mengganti jika ada) TRIGGER bernama books_on_insert dan menentukan bahwa kita ingin pemicunya mengaktifkan BEFORE INSERT terjadi untuk books tabel, dan berlaku untuk setiap dan semua baris di dalamnya.

'Kode' pemicu itu sendiri cukup sederhana:Kami SELECT nilai tambahan berikutnya dari books_sequence yang kami buat sebelumnya SEQUENCE , dan memasukkannya ke dalam :new catatan books tabel di .id yang ditentukan lapangan.

Catatan:FROM dual bagian diperlukan untuk menyelesaikan kueri yang tepat tetapi secara efektif tidak relevan. dual tabel hanyalah satu baris data dummy dan ditambahkan, dalam hal ini, hanya agar dapat diabaikan dan sebagai gantinya kita dapat menjalankan fungsi sistem dari pemicu kita daripada mengembalikan semacam data.

Kolom IDENTITAS

IDENTITY kolom diperkenalkan di Oracle 12c, memungkinkan fungsionalitas peningkatan otomatis sederhana di versi Oracle modern.

Menggunakan IDENTITY kolom ini secara fungsional mirip dengan sistem database lainnya. Membuat ulang books kami di atas skema tabel di Oracle 12c modern atau lebih tinggi, kami cukup menggunakan definisi kolom berikut.

CREATE TABLE books (
  id      NUMBER        GENERATED BY DEFAULT ON NULL AS IDENTITY,
  title   VARCHAR2(100) NOT NULL
);

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Mengikat variabel ke nama tabel dengan cx_Oracle

  2. Kueri yang menampilkan gabungan luar berperilaku berbeda di Oracle 12c

  3. Hitung perbedaan antara 2 tanggal / waktu di Oracle SQL

  4. LN() Fungsi di Oracle

  5. memberikan nama pengguna &kata sandi yang benar, dapatkan ORA-01017:nama pengguna/kata sandi tidak valid; masuk ditolak