場景:數據倉庫,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');
【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 ;
最終結果: