oracle數據庫,怎么給已有數據的表添加自增字段


場景:數據倉庫,ODI為使用Oracle Incremental Update IKM,需要對一事實表增加主鍵。

思想:基於老表創建新表,添加自增字段(序列+觸發器實現),把老數據導入新表,刪除老表,修改新表名字為老表

[1] 假如有一測試表DEPT,我們要給DEPT表增加ID字段

CREATE TABLE DEPT AS SELECT * FROM SCOTT.DEPT

或者自己創建

DROP TABLE "DEPT";
CREATE TABLE "DEPT" (
"DEPTNO" NUMBER(2) NOT NULL ,
"DNAME" VARCHAR2(14 BYTE) NULL ,
"LOC" VARCHAR2(13 BYTE) NULL 
)
;
INSERT INTO "DEPT" VALUES ('10', 'ACCOUNTING', 'NEW YORK');
INSERT INTO "DEPT" VALUES ('20', 'RESEARCH', 'DALLAS');
INSERT INTO "DEPT" VALUES ('30', 'SALES', 'CHICAGO');
INSERT INTO "DEPT" VALUES ('40', 'OPERATIONS', 'BOSTON');

clip_image001

【2】創建一個新表DEPT1

方法1: 導出源表結構,增加一個字段ID

CREATE TABLE "DEPT1" (
"ID" NUMBER(2) PRIMARY KEY,
"DEPTNO" NUMBER(2) NOT NULL ,
"DNAME" VARCHAR2(14 BYTE) NULL ,
"LOC" VARCHAR2(13 BYTE) NULL 
)

方法2:

---只會復制表數據和表結構,不會有任何約束
CREATE TABLE DEPT1 AS SELECT * FROM DEPT WHERE 1<>1

--添加列
ALTER TABLE "DEPT1" ADD ID NUMBER
ALTER TABLE "DEPT1" ADD PRIMARY KEY ("ID");

【3】創建自增序列

DROP SEQUENCE SEQ_DEPT

CREATE SEQUENCE SEQ_DEPT INCREMENT BY 1 START WITH 1 MINVALUE 1 NOMAXVALUE NOCYCLE NOCACHE;

【4】觸發器實現ID自增加

DROP TRIGGER TRG_BEFORE_INSERT_DEPT
CREATE TRIGGER TRG_BEFORE_INSERT_DEPT  BEFORE INSERT ON DEPT1 
FOR EACH ROW
BEGIN
    SELECT
        SEQ_DEPT.NEXTVAL INTO :NEW.ID
    FROM
        DUAL ;
    END ;

【5】老數據導入新表DEPT1

INSERT INTO DEPT1("DEPTNO", "DNAME", "LOC") SELECT * FROM DEPT

【6】刪除舊表DEPT

DROP TABLE DEPT

【7】DEPT1改名為DEPT

RENAME DEPT1 TO DEPT
---或者
ALTER TABLE DEPT RENAME TO DEPT;

【8】觸發器會自動更新為新表。

DROP TRIGGER TRG_BEFORE_INSERT_DEPT
CREATE TRIGGER TRG_BEFORE_INSERT_DEPT  BEFORE INSERT ON DEPT FOR EACH ROW
BEGIN
    SELECT
        SEQ_DEPT.NEXTVAL INTO :NEW.ID
    FROM
        DUAL ;
    END ;

最終結果:

image


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM