Saya tinggal dan bekerja dekat dengan fasilitas Microsoft. Dengan demikian, banyak dari karyawan kami saat ini adalah mantan karyawan Microsoft yang berasal dari latar belakang SQL Server. SQL Server memungkinkan Anda membuat tabel dengan kolom IDENTITAS. Oracle 12c sekarang memungkinkan Anda melakukan hal yang sama. Ini akan membantu mereka yang membuat transisi dari SQL Server ke Oracle. Ini juga memungkinkan perusahaan dengan lebih mudah mem-port aplikasi dari SQL Server, atau database lain yang memungkinkan kolom IDENTITY, ke Oracle.
Pertama saya akan membuat tabel dengan kolom IDENTITY dan mengisinya dengan beberapa baris data.
SQL> create table test_tab (2 id NUMBER GENERATED BY DEFAULT ON NULL AS IDENTITY, 3 val VARCHAR2(20));Tabel dibuat.SQL> masukkan ke dalam nilai test_tab (val) ('baris pertama saya');1 baris create.SQL> masukkan ke dalam nilai test_tab (val) ('baris kedua saya');1 baris dibuat.SQL> commit;Komit selesai.
Perhatikan bahwa saya tidak memasukkan nilai apa pun ke dalam kolom ID. Sekarang mari kita query tabelnya.
SQL> pilih * dari test_tab;ID VAL---------- --------------------1 baris pertama saya2 baris kedua sayaSeperti yang Anda lihat, nilai ID saya telah ditambahkan seperti yang Anda harapkan. Dalam pembuatan tabel, saya mendefinisikan kolom IDENTITAS ini dengan: GENERATED BY DEFAULT ON NULL
Klausa BY DEFAULT berarti Oracle akan secara otomatis menetapkan nilai berikutnya dalam urutan jika Anda menghilangkannya dalam pernyataan INSERT Anda. Jika Anda memasukkannya, maka Oracle akan menggunakan nilai yang Anda tentukan. Pertimbangkan ini:
SQL> masukkan ke dalam nilai test_tab (4,'specified ID=4');1 baris dibuat.SQL> commit;Commit complete.SQL> pilih * dari test_tab; ID VAL---------- -------------------- 1 baris pertama saya 2 baris kedua saya 4 ID yang ditentukan=4Seperti yang Anda lihat, karena saya secara eksplisit menyatakan ID=4 dan Oracle membiarkan nilai itu berlalu. Apa yang terjadi ketika saya mencoba memasukkan nilai berikutnya, yang seharusnya 3?
SQL> masukkan ke dalam nilai test_tab (val) ('baris saya setelah ID=4');1 baris dibuat.SQL> commit;Komit selesai.SQL> pilih * dari test_tab; ID VAL---------- -------------------- 1 baris pertama saya 2 baris kedua saya 4 ID yang ditentukan=4 3 baris setelah ID =4Di atas bekerja seperti yang saya harapkan. Nilai ID yang tersedia berikutnya digunakan. Tetapi apakah penyisipan berikutnya akan menggunakan '4' atau '5'?SQL> masukkan ke dalam nilai test_tab (val) ('baris kelima saya');1 baris dibuat.SQL> commit;Commit complete.SQL> pilih * dari tes_tab; ID VAL---------- -------------------- 1 baris pertama saya 2 baris kedua saya 4 ID yang ditentukan=4 3 baris setelah ID =4 4 baris kelima sayaUh oh! Nilai duplikat diizinkan. Saya mengharapkan batasan Kunci Utama dibuat untuk menegakkan konsep nilai "identitas", tetapi itu tidak terjadi. Kendala apa yang ada?SQL> pilih constraint_name,constraint_type,table_name,search_condition from user_constraints;CONSTRAINT_NAME C TABLE_NAME--------------------------- --- - ------------------------------SEARCH_CONDITION--------------- -------------------------------------------------- ---------------SYS_C004978 C TEST_TAB"ID" BUKAN NULLJadi satu-satunya batasan adalah batasan pemeriksaan NOT NULL. Sekarang mari kita hapus baris terakhir itu dan tambahkan batasan PK.SQL> delete from test_tab where val='my kelima baris';1 baris dihapus.SQL> commit;Commit complete.SQL> alter table test_tab add constraint kunci utama test_tab_pk (id);Tabel diubah.Sekarang saya akan memastikan bahwa saya memiliki beberapa data untuk diuji.SQL> masukkan ke dalam nilai test_tab (val) ('setelah batasan pk');1 baris dibuat.SQL> masukkan ke dalam nilai test_tab (id,val) ( 6,'secara eksplisit mengatur id=6');1 baris dibuat.SQL> commit;Commit complete.SQL> pilih * dari test_tab; ID VAL---------- -------------------- 1 baris pertama saya 2 baris kedua saya 4 ID yang ditentukan=4 3 baris setelah ID =4 5 setelah batasan pk 6 secara eksplisit mengatur id=66 baris yang dipilih.Jadi saya secara eksplisit menambahkan ID=6. Jika ini seperti ketika saya secara eksplisit menambahkan ID=4, sisipan saya berikutnya akan mencoba menggunakan ID=6 dan dengan batasan PK di tempat, pengecualian akan dilemparkan.SQL> masukkan ke dalam nilai test_tab (val) (' setelah ID=6');masukkan ke dalam nilai test_tab (val) ('setelah ID=6')*ERROR pada baris 1:ORA-00001:batasan unik (PEASLAND.TEST_TAB_PK) dilanggarJadi moral ceritanya adalah jika Anda menggunakan ON DEFAULT, bersiaplah untuk menangani benturan nilai identitas. Standarnya adalah SELALU, bukan ON DEFAULT. Dengan SELALU, Oracle akan selalu menggunakan generator nomor urut. Jika Anda mencoba menentukan nilai id, pengecualian akan terjadi.SQL> create table test_tab2(nomor id selalu dibuat sebagai identitas, val varchar2(20));Tabel dibuat.SQL> masukkan ke test_tab2(id,val) nilai (1,'baris pertama');masukkan ke dalam test_tab2(id,val) nilai (1,'baris pertama') *KESALAHAN pada baris 1:ORA-32795:tidak dapat menyisipkan ke dalam kolom identitas selalu yang dihasilkanTampilan *_TAB_COLUMNS dapat menunjukkan kepada Anda kolom mana dalam tabel yang merupakan kolom IDENTITAS.SQL> pilih column_name,identity_column from user_tab_columns where table_name='TEST_TAB';COLUMN_NAME IDE-------------- - ---ID YAVAL TIDAKJika Anda menggunakan kolom IDENTITY di tabel Anda, berhati-hatilah untuk menguji untuk memastikan Anda memahami bahwa itu berfungsi dengan benar untuk aplikasi Anda. Saya terkejut bahwa batasan PK atau UNIK tidak disertakan secara otomatis yang memungkinkan saya menambahkan nilai duplikat.