Cara membuat id dengan AUTO_INCREMENT pada Oracle?

Tampaknya bahwa ada tidak ada konsep AUTO_INCREMENT di Oracle, sampai dengan dan termasuk versi 11g.

Bagaimana saya bisa membuat sebuah kolom yang berperilaku seperti auto increment di Oracle 11g?

Mengomentari pertanyaan (4)
Larutan

Tidak ada hal seperti itu sebagai "auto_increment" atau "identitas" kolom di Oracle sebagai Oracle 11g. Namun, anda dapat model ini dengan mudah dengan urutan dan pemicu:

Tabel definisi:

CREATE TABLE departments (
  ID           NUMBER(10)    NOT NULL,
  DESCRIPTION  VARCHAR2(50)  NOT NULL);

ALTER TABLE departments ADD (
  CONSTRAINT dept_pk PRIMARY KEY (ID));

CREATE SEQUENCE dept_seq START WITH 1;

Pemicu definisi:

CREATE OR REPLACE TRIGGER dept_bir 
BEFORE INSERT ON departments 
FOR EACH ROW

BEGIN
  SELECT dept_seq.NEXTVAL
  INTO   :new.id
  FROM   dual;
END;
/

UPDATE:

IDENTITAS kolom adalah sekarang tersedia di Oracle 12c:

create table t1 (
    c1 NUMBER GENERATED by default on null as IDENTITY,
    c2 VARCHAR2(10)
    );

atau menentukan awal dan nilai kenaikan, juga mencegah masukkan ke kolom identitas (DIHASILKAN SELALU) (sekali lagi, Oracle 12c+ only)

create table t1 (
    c1 NUMBER GENERATED ALWAYS as IDENTITY(START with 1 INCREMENT by 1),
    c2 VARCHAR2(10)
    );

Selain itu, Oracle 12 juga memungkinkan untuk menggunakan urutan sebagai nilai default:

CREATE SEQUENCE dept_seq START WITH 1;

CREATE TABLE departments (
  ID           NUMBER(10)    DEFAULT dept_seq.nextval NOT NULL,
  DESCRIPTION  VARCHAR2(50)  NOT NULL);

ALTER TABLE departments ADD (
  CONSTRAINT dept_pk PRIMARY KEY (ID));
Komentar (8)

SYS_GUID kembali GUID-- yang secara global unik ID. A SYS_GUID adalah BAKU(16). Itu tidak menghasilkan incrementing nilai numerik.

Jika anda ingin membuat incrementing numeric key, kau'll ingin membuat urutan.

CREATE SEQUENCE name_of_sequence
  START WITH 1
  INCREMENT BY 1
  CACHE 100;

Anda akan kemudian menggunakan urutan yang di INSERT pernyataan

INSERT INTO name_of_table( primary_key_column,  )
  VALUES( name_of_sequence.nextval,  );

Atau anda dapat menentukan pemicu yang secara otomatis terisi dengan nilai kunci primer menggunakan urutan

CREATE OR REPLACE TRIGGER trigger_name
  BEFORE INSERT ON table_name
  FOR EACH ROW
BEGIN
  SELECT name_of_sequence.nextval
    INTO :new.primary_key_column
    FROM dual;
END;

Jika anda menggunakan Oracle 11.1 atau yang lebih baru, anda dapat menyederhanakan memicu sedikit

CREATE OR REPLACE TRIGGER trigger_name
  BEFORE INSERT ON table_name
  FOR EACH ROW
BEGIN
  :new.primary_key_column := name_of_sequence.nextval;
END;

Jika anda benar-benar ingin menggunakan SYS_GUID

CREATE TABLE table_name (
  primary_key_column raw(16) default sys_guid() primary key,

)
Komentar (7)

Di Oracle 12c selanjutnya anda bisa melakukan sesuatu seperti,

CREATE TABLE MAPS
(
  MAP_ID INTEGER GENERATED ALWAYS AS IDENTITY (START WITH 1 INCREMENT BY 1) NOT NULL,
  MAP_NAME VARCHAR(24) NOT NULL,
  UNIQUE (MAP_ID, MAP_NAME)
);

Dan di Oracle (Pra 12c).

-- create table
CREATE TABLE MAPS
(
  MAP_ID INTEGER NOT NULL ,
  MAP_NAME VARCHAR(24) NOT NULL,
  UNIQUE (MAP_ID, MAP_NAME)
);

-- create sequence
CREATE SEQUENCE MAPS_SEQ;

-- create tigger using the sequence
CREATE OR REPLACE TRIGGER MAPS_TRG 
BEFORE INSERT ON MAPS 
FOR EACH ROW
WHEN (new.MAP_ID IS NULL)
BEGIN
  SELECT MAPS_SEQ.NEXTVAL
  INTO   :new.MAP_ID
  FROM   dual;
END;
/
Komentar (6)

Berikut ini adalah tiga rasa:

  1. numerik. Sederhana meningkatkan nilai numerik, misalnya 1,2,3,....
  2. GUID. secara global univeral pengenal, sebagai MENTAH datatype.
  3. GUID (string). Sama seperti di atas, tetapi sebagai string yang mungkin lebih mudah untuk menangani dalam beberapa bahasa.

x adalah kolom identitas. Pengganti FOO dengan nama tabel di masing-masing contoh.

-- numerical identity, e.g. 1,2,3...
create table FOO (
    x number primary key
);
create sequence  FOO_seq;

create or replace trigger FOO_trg
before insert on FOO
for each row
begin
  select FOO_seq.nextval into :new.x from dual;
end;
/

-- GUID identity, e.g. 7CFF0C304187716EE040488AA1F9749A
-- use the commented out lines if you prefer RAW over VARCHAR2.
create table FOO (
    x varchar(32) primary key        -- string version
    -- x raw(32) primary key         -- raw version
);

create or replace trigger FOO_trg
before insert on FOO
for each row
begin
  select cast(sys_guid() as varchar2(32)) into :new.x from dual;  -- string version
  -- select sys_guid() into :new.x from dual;                     -- raw version
end;
/

update:

Oracle 12c memperkenalkan dua varian yang don't tergantung pada pemicu:

create table mytable(id number default mysequence.nextval);
create table mytable(id number generated as identity);

Yang pertama menggunakan urutan cara tradisional; kedua berhasil nilai internal.

Komentar (0)

Dengan asumsi anda berarti kolom seperti SQL Server kolom identitas?

Dalam Oracle, anda menggunakan URUTAN untuk mencapai fungsi yang sama. I'll melihat apakah saya dapat menemukan link yang bagus dan posting di sini.

Update: sepertinya anda menemukan diri anda. Berikut adalah link pula: http://www.techonthenet.com/oracle/sequences.php

Komentar (0)

Oracle Database 12c memperkenalkan Identitas, auto-incremental (system-generated) kolom. Sebelumnya database versi (sampai 11g), anda biasanya menerapkan Identitas dengan membuat Urutan dan Pemicu. Dari 12c dan seterusnya, anda dapat membuat Meja anda sendiri dan menentukan kolom yang akan dihasilkan sebagai Identitas.

Artikel berikut menjelaskan bagaimana cara menggunakannya:

Identitas kolom - entri baru di Oracle Database 12c

Komentar (1)

Dimulai dengan Oracle 12c ada dukungan untuk Identitas kolom di salah satu dari dua cara:

  1. Urutan + Tabel - Dalam solusi ini, anda masih membuat urutan seperti biasanya, kemudian anda gunakan berikut DDL:

MEMBUAT TABEL MyTable (NOMOR ID DEFAULT MyTable_Seq.NEXTVAL, ...)

  1. Meja Hanya - Dalam larutan ini tidak ada urutan yang ditentukan secara eksplisit. Anda akan menggunakan berikut DDL:

MEMBUAT TABEL MyTable (NOMOR ID DIHASILKAN SEBAGAI IDENTITAS, ...)

Jika anda menggunakan cara pertama itu adalah kompatibel dengan ada cara untuk melakukan hal-hal. Kedua sedikit lebih mudah dan lebih sejalan dengan sisa RDMS sistem di luar sana.

Komentar (0)

Pemicu dan Urutan dapat digunakan ketika anda ingin serial number bahwa siapa pun dapat dengan mudah membaca/ingat/memahami. Tapi jika anda don't ingin mengelola Kolom ID (seperti emp_id) dengan cara ini, dan nilai dari kolom ini tidak cukup banyak, anda dapat menggunakan SYS_GUID() pada Pembuatan Tabel untuk mendapatkan Auto Increment seperti ini.

CREATE TABLE  
(emp_id RAW(16) DEFAULT SYS_GUID() PRIMARY KEY,
name VARCHAR2(30));

Sekarang anda emp_id kolom akan menerima "pengidentifikasi unik global value". anda dapat memasukkan nilai dalam tabel dengan mengabaikan kolom emp_id seperti ini.

INSERT INTO  (name) VALUES ('name value');

Jadi, itu akan menyisipkan nilai yang unik untuk anda emp_id Kolom.

Komentar (1)

hal ini disebut Identitas Kolom dan tersedia hanya dari oracle Oracle 12c

CREATE TABLE identity_test_tab
(
   id            NUMBER GENERATED ALWAYS AS IDENTITY,
   description   VARCHAR2 (30)
);

contoh insert into Identitas Kolom seperti di bawah ini

INSERT INTO identity_test_tab (description) VALUES ('Just DESCRIPTION');

1-turut dibuat.

anda TIDAK dapat melakukan insert seperti di bawah ini

INSERT INTO identity_test_tab (id, description) VALUES (NULL, 'ID=NULL and DESCRIPTION');

ERROR at line 1: ORA-32795: tidak dapat memasukkan ke dihasilkan selalu kolom identitas

INSERT INTO identity_test_tab (id, description) VALUES (999, 'ID=999 and DESCRIPTION');

ERROR at line 1: ORA-32795: tidak dapat memasukkan ke dihasilkan selalu kolom identitas

berguna link

Komentar (0)

Berikut ini adalah solusi lengkap w.r.t pengecualian/penanganan error untuk auto increment, solusi ini kompatibel dan akan bekerja pada 11g & 12c, khususnya jika aplikasi ini di produksi.

Silahkan ganti 'TABLE_NAME' dengan anda sesuai nama tabel

--checking if table already exisits
BEGIN
    EXECUTE IMMEDIATE 'DROP TABLE TABLE_NAME';
    EXCEPTION WHEN OTHERS THEN NULL;
END;
/

--creating table
CREATE TABLE TABLE_NAME (
       ID NUMBER(10) PRIMARY KEY NOT NULL,
       .
       .
       .
);

--checking if sequence already exists
BEGIN
    EXECUTE IMMEDIATE 'DROP SEQUENCE TABLE_NAME_SEQ';
    EXCEPTION WHEN OTHERS THEN NULL;
END;

--creating sequence
/
CREATE SEQUENCE TABLE_NAME_SEQ START WITH 1 INCREMENT BY 1 MINVALUE 1 NOMAXVALUE NOCYCLE CACHE 2;

--granting rights as per required user group
/
GRANT SELECT, INSERT, UPDATE, DELETE ON TABLE_NAME TO USER_GROUP;

-- creating trigger
/
CREATE OR REPLACE TRIGGER TABLE_NAME_TS BEFORE INSERT OR UPDATE ON TABLE_NAME FOR EACH ROW
BEGIN    
    -- auto increment column
    SELECT TABLE_NAME_SEQ.NextVal INTO :New.ID FROM dual;

    -- You can also put some other required default data as per need of your columns, for example
    SELECT SYS_CONTEXT('USERENV', 'SESSIONID') INTO :New.SessionID FROM dual;
    SELECT SYS_CONTEXT('USERENV','SERVER_HOST') INTO :New.HostName FROM dual;
    SELECT SYS_CONTEXT('USERENV','OS_USER') INTO :New.LoginID FROM dual;    
    .
    .
    .
END;
/
Komentar (0)
FUNCTION UNIQUE2(
 seq IN NUMBER
) RETURN VARCHAR2
AS
 i NUMBER := seq;
 s VARCHAR2(9);
 r NUMBER(2,0);
BEGIN
  WHILE i > 0 LOOP
    r := MOD( i, 36 );
    i := ( i - r ) / 36;
    IF ( r < 10 ) THEN
      s := TO_CHAR(r) || s;
    ELSE
      s := CHR( 55 + r ) || s;
    END IF;
  END LOOP;
  RETURN 'ID'||LPAD( s, 14, '0' );
END;
Komentar (0)

Ini adalah bagaimana saya melakukan ini pada tabel yang ada dan kolom (nama id):

UPDATE table SET id=ROWNUM;
DECLARE
  maxval NUMBER;
BEGIN
  SELECT MAX(id) INTO maxval FROM table;
  EXECUTE IMMEDIATE 'DROP SEQUENCE table_seq';
  EXECUTE IMMEDIATE 'CREATE SEQUENCE table_seq START WITH '|| TO_CHAR(TO_NUMBER(maxval)+1) ||' INCREMENT BY 1 NOMAXVALUE';
END;
CREATE TRIGGER table_trigger
  BEFORE INSERT ON table
  FOR EACH ROW
BEGIN
  :new.id := table_seq.NEXTVAL;
END;
Komentar (0)
FUNCTION GETUNIQUEID_2 RETURN VARCHAR2
AS
v_curr_id NUMBER;
v_inc NUMBER;
v_next_val NUMBER;
pragma autonomous_transaction;
begin 
CREATE SEQUENCE sequnce
START WITH YYMMDD0000000001
INCREMENT BY 1
NOCACHE
select sequence.nextval into v_curr_id from dual;
if(substr(v_curr_id,0,6)= to_char(sysdate,'yymmdd')) then
v_next_val := to_number(to_char(SYSDATE+1, 'yymmdd') || '0000000000');
v_inc := v_next_val - v_curr_id;
execute immediate ' alter sequence sequence increment by ' || v_inc ;
select sequence.nextval into v_curr_id from dual;
execute immediate ' alter sequence sequence increment by 1';
else
dbms_output.put_line('exception : file not found');
end if;
RETURN 'ID'||v_curr_id;
END;
Komentar (0)
  create trigger t1_trigger
  before insert on AUDITLOGS
  for each row
   begin
     select t1_seq.nextval into :new.id from dual;
   end;

hanya aku yang harus hanya mengubah nama tabel (AUDITLOGS) dengan nama tabel dan baru.id dengan yang baru.column_name

Komentar (0)

Mungkin hanya mencoba script sederhana ini:

http://www.hlavaj.sk/ai.php

Hasilnya adalah:

CREATE SEQUENCE TABLE_PK_SEQ; 
CREATE OR REPLACE TRIGGER TR_SEQ_TABLE BEFORE INSERT ON TABLE FOR EACH ROW 

BEGIN
SELECT TABLE_PK_SEQ.NEXTVAL
INTO :new.PK
FROM dual;
END;
Komentar (1)