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
);