Oracle聯合主鍵自增
阿新 • • 發佈:2019-01-30
新建表
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的實現。如果有更好的辦法請留下你的建議。