Cum de a crea id-ul cu AUTO_INCREMENT pe Oracle?

Se pare că nu există nici un concept de AUTO_INCREMENT în Oracle, până la și inclusiv versiunea 11g.

Cum pot crea o coloană care se comportă ca auto increment în Oracle 11g?

Comentarii la întrebare (4)
Soluția

Nu există nici un astfel de lucru ca "auto_increment" sau "identitatea" coloane în Oracle ca de Oracle 11g. Cu toate acestea, se pot modela cu ușurință cu o secvență și un declanșator:

Tabelul de definiție:

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;

Declanșa definiție:

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:

"IDENTITATE" coloana este acum disponibil pe Oracle 12c:

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

sau specifica de pornire și creștere a valorilor, de asemenea, prevenind orice se introduce în coloană de identitate (GENERAT ÎNTOTDEAUNA) (din nou, Oracle 12c+ numai)

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

Alternativ, Oracle 12, de asemenea, permite de a utiliza o secvență ca o valoare implicită:

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));
Comentarii (8)

SYS_GUID returnează un GUID-un ID unic global. O SYS_GUID este o PRIME(16). Ea nu generează o incrementare valoare numerică.

Dacă doriți să creați un incrementarea numeric cheia,'ll doriți să creați o secvență.

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

Apoi, va trebui să fie utilizați secvența în "INSERT" declarație

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

Sau puteți defini un trigger care populează în mod automat valoarea cheii primare folosind secvența

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;

Dacă utilizați Oracle 11.1 sau mai târziu, puteți simplifica declanșa un pic

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

Dacă într-adevăr doriți să utilizați SYS_GUID

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

)
Comentarii (7)

În Oracle 12c mai departe ai putea face ceva de genul,

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

Și în Oracle (Pre 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;
/
Comentarii (6)

Aici sunt trei arome:

  1. numeric. Simplu creștere valoare numerică, de exemplu 1,2,3,....
  2. GUID. la nivel global univeral identificator, ca un "PRIME" tip de date.
  3. GUID (string). La fel ca mai sus, dar ca un șir de caractere care ar putea fi mai ușor de manevrat în unele limbi.

"x" este o coloană de identitate. Substitut " FOO " cu nume de tabel în fiecare dintre exemple.

-- 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 introduce aceste două variante pe care don't depinde de factori declansatori:

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

Primul folosește o secvență în mod tradițional; cel de-al doilea gestionează valoare pe plan intern.

Comentarii (0)

Presupunând că vrei să spui o coloană ca SQL Server coloană de identitate?

În Oracle, puteți folosi o SECVENȚĂ pentru a obține aceeași funcționalitate. Am'll să văd dacă pot găsi un link bun și post-l aici.

Update: se pare ca ai gasit-o singur. Aici este link-ul, oricum: http://www.techonthenet.com/oracle/sequences.php

Comentarii (0)

Oracle Database 12c introdus de Identitate, un auto-elementare (generat de sistem) coloană. În ultimele versiuni de baze de date (până 11g), de obicei pună în aplicare o Identitate prin a crea o Secvență și un Trăgaci. De la 12c mai departe, vă puteți crea propria dvs. Masă și să definească coloana care trebuie să fie generate ca o Identitate.

Următorul articol explică cum să-l folosească:

Identitate coloane - O nouă intrare în baza de Date Oracle 12c

Comentarii (1)

Incepand cu Oracle 12c există suport pentru coloanele de Identitate, în unul din două moduri:

  1. Secvență + Masa - În această soluție încă de a crea o secvență ca de obicei, apoi utilizați următoarele DDL:

CREAȚI TABELUL MyTable (NUMĂRUL de IDENTIFICARE DEFAULT MyTable_Seq.NEXTVAL, ...)

  1. Masa de Numai - În această soluție nicio secvență este specificat în mod explicit. Utilizați următoarele DDL:

CREAȚI TABELUL MyTable (NUMĂRUL de IDENTIFICARE GENERATE CA IDENTITATEA, ...)

Dacă utilizați mai întâi modul în care aceasta este compatibilă cu actualul mod de a face lucrurile. Cea de-a doua este un pic mai simplă și este mai în linie cu restul de RDMS sistemelor de acolo.

Comentarii (0)

Trăgaci " și " Secvență poate fi utilizat atunci când doriți serializat numărul pe care oricine o poate citi cu ușurință/amintiți-vă/înțelege. Dar dacă nu't doresc să gestioneze ID-ul de Coloana (ca emp_id) de acest fel, și valoarea de această coloană nu este mult considerabile, puteți utilizaSYS_GUID()` la Crearea de Masă pentru a obține Auto Increment de genul asta.

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

Acum emp_id coloana va accepta "identificator global unic valoarea". puteți introduce o valoare în tabelul de ignorarea emp_id coloană de genul asta.

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

Astfel, se va introduce o valoare unică ta emp_id Coloana.

Comentarii (1)

este numit de Identitate Coloane și este disponibil numai de la oracle Oracle 12c

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

exemplu de a introduce în Coloanele de Identitate` ca mai jos

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

1 rând create.

NU se poate face introduce ca mai jos

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

EROARE la linia 1: ORA-32795: nu se poate introduce într-o a generat mereu coloană de identitate

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

EROARE la linia 1: ORA-32795: nu se poate introduce într-o a generat mereu coloană de identitate

link util

Comentarii (0)

Aici este o soluție completă w.r.t excepție/eroare de manipulare pentru auto increment, această soluție este compatibil și va funcționa pe 11g & 12c, în special în cazul în care cererea este în producție.

Vă rugăm să înlocuiți 'TABLE_NAME' cu nume de tabel corespunzătoare

--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;
/
Comentarii (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;
Comentarii (0)

Acest lucru este cum am făcut asta pe un tabel existent și coloană (nume id-ul):

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;
Comentarii (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;
Comentarii (0)
  create trigger t1_trigger
  before insert on AUDITLOGS
  for each row
   begin
     select t1_seq.nextval into :new.id from dual;
   end;

doar trebuie sa schimbi doar numele tabelului (AUDITLOGS) cu nume de tabel și noi.id-ul cu noi.column_name

Comentarii (0)

Poate doar să încercați acest script simplu:

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

Rezultatul este:

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;
Comentarii (1)