How to create id with AUTO_INCREMENT on Oracle?

后端 未结 16 1607
死守一世寂寞
死守一世寂寞 2020-11-21 04:52

It appears that there is no concept of AUTO_INCREMENT in Oracle, up until and including version 11g.

How can I create a column that behaves like auto increment in Or

16条回答
  •  名媛妹妹
    2020-11-21 05:57

    Here is complete solution w.r.t exception/error handling for auto increment, this solution is backward compatible and will work on 11g & 12c, specifically if application is in production.

    Please replace 'TABLE_NAME' with your appropriate table name

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

提交回复
热议问题