就是……在 Oracle 里给一个新表或者一堆表添加一下序列和触发器,能让它在新增记录的时候可以实现自增主键的 feature。
建立单个序列
create sequence SEQ_[TABLE_NAME]
minvalue 1
maxvalue 99999999999999999999
start with 1
increment by 1
nocache;
建立单个触发器
CREATE OR REPLACE TRIGGER TRG_[TABLE_NAME]_ID
BEFORE INSERT ON [TABLE_NAME]
FOR EACH ROW
BEGIN
if(:new.id is null) then
begin
select SEQ_[TABLE_NAME].nextval into :new.id from dual;
end;
end if;
END;
建立多个序列
首先执行
select * FROM user_cons_columns cu, user_constraints au
WHERE cu.constraint_name = au.constraint_name
AND au.constraint_type = 'P'
AND au.table_name IN (SELECT TABLE_NAME FROM USER_TABLES);
查看是否有误
然后执行
SELECT
'create sequence SEQ_'|| au.table_name||'
minvalue 1
maxvalue 99999999999999999999
start with 1
increment by 1
nocache;'
FROM user_cons_columns cu,
user_constraints au
WHERE cu.constraint_name = au.constraint_name
AND au.constraint_type= 'P'
AND au.table_name IN
(SELECT TABLE_NAME FROM USER_TABLES);
以创建执行脚本
最后执行全部查询结果。
建立多个触发器
首先执行
SELECT
'create or replace
TRIGGER TRG_'|| au.table_name||' BEFORE INSERT ON '
||au.table_name||
' FOR EACH ROW
BEGIN
if(:new.'||cu.column_name ||' is null) then
begin
SELECT SEQ_'||au.table_name||'.NEXTVAL INTO :NEW.'||cu.column_name ||' FROM DUAL; end; end if; END;'
FROM user_cons_columns cu,
user_constraints au
WHERE cu.constraint_name = au.constraint_name
AND au.constraint_type = 'P'
AND au.table_name IN
(SELECT TABLE_NAME FROM USER_TABLES);
然后执行全部查询结果。