Tampaknya tidak ada konsep AUTO_INCREMENT di Oracle, hingga dan termasuk versi 11g.
Bagaimana saya bisa membuat kolom yang berperilaku seperti kenaikan otomatis di Oracle 11g?
sql
oracle
auto-increment
Sushan Ghimire
sumber
sumber
BEFORE INSERT
pemicu di atas meja dan menarik nilai dari urutan untuk membuat kenaikan otomatisJawaban:
Tidak ada yang namanya kolom "auto_increment" atau "identitas" di Oracle pada Oracle 11g . Namun, Anda dapat memodelkannya dengan mudah dengan urutan dan pemicu:
Definisi tabel:
Definisi pemicu:
MEMPERBARUI:
IDENTITY
kolom sekarang tersedia di Oracle 12c:atau tentukan nilai awal dan kenaikan, juga mencegah penyisipan ke kolom identitas (
GENERATED ALWAYS
) (sekali lagi, hanya Oracle 12c +)Atau, Oracle 12 juga memungkinkan untuk menggunakan urutan sebagai nilai default:
sumber
dept_seq
asalnya!SELECT .. INTO
pemicu yang bisa Anda lakukan:new.id := dept_seq.NEXTVAL;
.SYS_GUID
mengembalikan GUID - ID unik global. ASYS_GUID
adalah aRAW(16)
. Itu tidak menghasilkan nilai numerik yang bertambah.Jika Anda ingin membuat kunci numerik yang bertambah, Anda ingin membuat urutan.
Anda kemudian akan menggunakan urutan itu dalam
INSERT
pernyataan AndaAtau Anda dapat menentukan pemicu yang secara otomatis mengisi nilai kunci utama menggunakan urutan
Jika Anda menggunakan Oracle 11.1 atau lebih baru, Anda dapat menyederhanakan pelatuk sedikit
Jika Anda benar-benar ingin menggunakannya
SYS_GUID
sumber
CACHE 100; in CREATE SEQUENCE name_of_sequence START WITH 1 INCREMENT BY 1 CACHE 100;
harus dilakukanSYS_GUID()
adalah aRAW(16)
, bukan 32.SYS_GUID
dokumentasi menyatakan suaturaw(32)
yang bingung.Di Oracle 12c dan seterusnya Anda bisa melakukan sesuatu seperti,
Dan di Oracle (Pre 12c).
sumber
IDENTITY
contohnya jauh lebih jelas dalam jawaban ini.WHEN (new.MAP_ID IS NULL)
ada dalam jawaban yang diterima. Terpilih.WHEN ( new.MAP_ID is null)
bukan kode yang baik dalam kasus ini dan sudah dijelaskan di bagian komentar oleh @ABCade di bawah jawaban yang diterima .. sudah dibaca;)CREATE OR REPLACE TRIGGER
keEND;
, saya mendapatkan jendela "Enter Binds". Jika saya mengklik "Terapkan" dan tidak melakukan hal lain di jendela itu, dan kemudian menjalankanALTER TRIGGER
perintah, semuanya baik, tetapi berharap ada cara untuk secara terprogram menyingkirkan pop-up itu dan menjalankan semuanya bersama-sama. Jika Anda mencobanya secara bersamaan, Anda mendapatkanPLS-00103: Encountered the symbol 'ALTER'
dan itu tidak sukaEXECUTE IMMEDIATE
, baik (kesalahan yang sama, hanya mengatakannya sajaEncountered the symbol 'EXECUTE'
).[42000][907] ORA-00907: missing right parenthesis
ketika menjalankan versi untuk Oracle 12c dan seterusnya. Ada ide ?Berikut ini tiga rasa:
RAW
tipe data.x
adalah kolom identitas. GantiFOO
dengan nama tabel Anda di masing-masing contoh.memperbarui:
Oracle 12c memperkenalkan dua varian ini yang tidak bergantung pada pemicu:
Yang pertama menggunakan urutan dengan cara tradisional; yang kedua mengelola nilai secara internal.
sumber
Anggap Anda maksud kolom seperti kolom identitas SQL Server?
Di Oracle, Anda menggunakan SEQUENCE untuk mencapai fungsi yang sama. Saya akan melihat apakah saya dapat menemukan tautan yang bagus dan mempostingnya di sini.
Pembaruan: sepertinya Anda menemukannya sendiri. Inilah tautannya: http://www.techonthenet.com/oracle/ followingences.php
sumber
Oracle Database 12c memperkenalkan Identity, kolom auto-incremental (dihasilkan sistem). Dalam versi database sebelumnya (hingga 11g), Anda biasanya menerapkan Identitas dengan membuat Sequence dan Trigger. Dari 12c dan seterusnya, Anda dapat membuat Tabel Anda sendiri dan menentukan kolom yang harus dihasilkan sebagai Identitas.
Artikel berikut menjelaskan cara menggunakannya:
Kolom identitas - Entri baru dalam Oracle Database 12c
sumber
Trigger
danSequence
dapat digunakan ketika Anda menginginkan nomor seri agar siapa pun dapat dengan mudah membaca / mengingat / mengerti. Tetapi jika Anda tidak ingin mengelola Kolom ID (seperti emp_id) dengan cara ini, dan nilai kolom ini tidak terlalu besar, Anda bisa menggunakanSYS_GUID()
Table Creation untuk mendapatkan Peningkatan Otomatis seperti ini.Sekarang
emp_id
kolom Anda akan menerima "nilai pengidentifikasi unik global". Anda bisa memasukkan nilai dalam tabel dengan mengabaikan kolom emp_id seperti ini.Jadi, itu akan memasukkan nilai unik ke
emp_id
Kolom Anda .sumber
SYS_GUID()
id-nya juga bernilai?Dimulai dengan Oracle 12c ada dukungan untuk kolom Identity dalam satu dari dua cara:
Sequence + Table - Dalam solusi ini Anda masih membuat urutan seperti biasa, maka Anda menggunakan DDL berikut:
BUAT Tabel MyTable (ID NUMBER DEFAULT MyTable_Seq.NEXTVAL , ...)
Tabel Saja - Dalam solusi ini tidak ada urutan yang ditentukan secara eksplisit. Anda akan menggunakan DDL berikut:
CREATE TABLE MyTable (ID NUMBER DIHASILKAN SEBAGAI IDENTITAS , ...)
Jika Anda menggunakan cara pertama itu kompatibel dengan cara yang ada dalam melakukan sesuatu. Yang kedua sedikit lebih mudah dan lebih sejalan dengan sisa sistem RDMS di luar sana.
sumber
itu disebut
Identity Columns
dan hanya tersedia dari Oracle oracle 12ccontoh masukkan ke dalam
Identity Columns
seperti di bawah iniAnda TIDAK bisa memasukkan seperti di bawah ini
tautan bermanfaat
sumber
Inilah solusi lengkap penanganan pengecualian / kesalahan wrt untuk kenaikan otomatis, solusi ini kompatibel mundur dan akan bekerja pada 11g & 12c, khususnya jika aplikasi sedang dalam produksi.
Harap ganti 'TABLE_NAME' dengan nama tabel yang sesuai
sumber
Ini adalah bagaimana saya melakukan ini pada tabel dan kolom yang ada (bernama id):
sumber
sumber
sumber
oracle memiliki urutan dan kolom identitas dalam 12c
http://www.oracle-base.com/articles/12c/identity-columns-in-oracle-12cr1.php#identity-columns
Saya menemukan ini tetapi tidak yakin apa rdb 7 adalah http://www.oracle.com/technetwork/products/rdb/0307-identity-columns-128126.pdf
sumber
hanya saya harus mengubah nama tabel (AUDITLOGS) dengan nama tabel Anda dan new.id dengan new.column_name
sumber
Mungkin coba saja skrip sederhana ini:
http://www.hlavaj.sk/ai.php
Hasilnya adalah:
sumber
select
versi Oracle modern. Anda cukup menggunakan:new.pk := TABLE_PK_SEQ.NEXTVAL