標籤:start 預設值 body ram nextval div 通過 賦值 code
1. Oracle實現主鍵自動成長
一般我們在Oracle實現主鍵自動成長,通常通過序列加觸發器實現。
定義序列用於擷取遞增數字
CREATE SEQUENCE 序列名[INCREMENT BY n][START WITH n] [{MAXVALUE n | NOMAXVALUE}][{MINVALUE n | NOMINVALUE}][{CYCLE | NOCYCLE}][{CACHE n | NOCACHE}]
定義觸發器,關聯序列和表,並在插入資料前補充主鍵ID
create [or replace] tigger 觸發器名 before inserton 表名[for each row]begin select 序列名.nextval into :new.id from dual; end
一般我們會加上條件以應對已經指定主鍵的情況
create [or replace] tigger 觸發器名 before inserton 表名[for each row WHEN(NEW.ID IS NULL)]begin select 序列名.nextval into :new.id from dual; end
2. EntityFramework預設值帶來的問題
通過觸發器和序列一般我們就可以實現主鍵的自動成長,但是在EF中,實體中的主鍵會被賦值為預設值0。這導致觸發器達不到觸發的(預設觸發條件),
這時我們就需要調整觸發器執行條件:當未指定id或者id為預設值0時自動產生主鍵。
create [or replace] tigger 觸發器名 before inserton 表名[for each row WHEN(NEW.ID IS NULL or NEW.ID = 0)]begin select 序列名.nextval into :new.id from dual; end
EntityFramework實體預設值遇到Oracle自增主鍵