1. 程式人生 > >Oracle聯合主鍵自增

Oracle聯合主鍵自增

新建表
這裡寫圖片描述

CREATE TABLE SCHEDULES
(
  SCHEDULES_ID NUMBER(19) DEFAULT NULL          NOT NULL,
  USER_ID      NUMBER(19) DEFAULT NULL          NOT NULL
    CONSTRAINT SCHEDULES_USERS_USER_ID_FK
    REFERENCES USERS
    ON DELETE CASCADE,
  DATE_TIME    DATE DEFAULT NULL                NOT NULL,
  EVENT        VARCHAR2(100
CHAR) DEFAULT NULL NOT NULL, CONSTRAINT SCHEDULES_ID_USER_ID_PK PRIMARY KEY (SCHEDULES_ID, USER_ID) )

SCHEDULES_ID和USER_ID是聯合主鍵
**要實現的是:**schedules_id根據user_id的不同自增,例如在user_id=1中,schedules_id最大是3,那麼新插入一條user_id=1的記錄,使schedules_id=4.user_id=2中,schedules_id最大是5,那麼新插入一條user_id=2的記錄,使schedules_id=6.

create or replace trigger tri_scheduleid_insert
before insert on SCHEDULES
for each row
  DECLARE
  begin
    select MAX(SCHEDULES_ID)+1 into :new.SCHEDULES_ID from SCHEDULES WHERE USER_ID=:new.USER_ID;
  end tri_scheduleid_insert;

直接使用觸發器實現,不用建立sequence。

但是當MAX(SCHEDULES_ID)不存在時,會無法插入
修改後觸發器的建立是

CREATE OR REPLACE TRIGGER tri_scheduleid_insert
BEFORE INSERT ON SCHEDULES
FOR EACH ROW
  DECLARE
    nextid NUMBER;
  BEGIN
    SELECT MAX(SCHEDULES_ID) + 1
    INTO nextid
    FROM SCHEDULES
    WHERE USER_ID = :new.USER_ID;
    IF INSERTING
    THEN
      IF nextid > 0
      THEN
        :new.SCHEDULES_ID := nextid;
      ELSE :NEW.SCHEDULES_ID := 1;
      END IF;
    END IF;

  END tri_scheduleid_insert;

首先定義一個變數nextid來儲存查詢得到的最大值+1,如果nextid大於0,則說明插入記錄的user_id的值存在,schedules_id=nextid;否則
說明插入記錄的user_id的值不存在,使schedules_id=1;
注意: :new.SCHEDULES_ID := nextid;
賦值等號左邊的“:”

同樣的思考應該可以不建立sequence來建立觸發器實現主鍵的自增。我沒有做,畢竟建立sequence還是有好處的。這裡聯合主鍵的自增我沒找到有關sequence的實現。如果有更好的辦法請留下你的建議。