Oracle資料庫主鍵值生成的兩種解決方案
阿新 • • 發佈:2018-12-16
解決方案一:使用序列和觸發器實現(推薦)
1、建立資料庫表 設定主鍵
create table Test_Table(
id number(10) primary key, /*主鍵,自動增加*/
remake varchar2(20)
);
2、建立自動增長序列
CREATE SEQUENCE TestTable_Sequence INCREMENT BY 1 -- 每次加幾個 START WITH 1 -- 從1開始計數 NOMAXVALUE -- 不設定最大值 NOCYCLE -- 一直累加,不迴圈 CACHE 10;
3、建立觸發器
CREATE TRIGGER Test_Increase BEFORE
insert ON Test_Table FOR EACH ROW
begin
select TestTable_Sequence.nextval into:New.id from dual;
end;
解決方案二:使用主鍵表儲存表最大主鍵值
1、建立測試表和最大值儲存表
create table Test_Table( id number(10) primary key, /*主鍵,自動增加*/ remake varchar2(20) ); create table SYS_MAXKEY( id NUMBER not null, /*主鍵*/ tablename VARCHAR2(50), /*表名*/ keyname VARCHAR2(50),/*表主鍵欄位名*/ maxkey NUMBER /*表主鍵當前最大值*/ );
2、為主鍵最大值記錄表建立序列
create sequence SEQ_SYS_MAXKEY
minvalue 1
maxvalue 999999999999999999999999999
start with 0
increment by 1
cache 20;
3、建立儲存過程
CREATE OR REPLACE PROCEDURE GETPK( ATABLENAME VARCHAR, AFIELDNAME VARCHAR, APKVALUE OUT NUMBER) IS COUNTNUM NUMBER; MKEY NUMBER; TTABLENAME VARCHAR(50); TFIELDNAME VARCHAR(50); DYNSTR VARCHAR(500); MAXKEYID NUMBER; BEGIN TTABLENAME := UPPER(ATABLENAME); TFIELDNAME := UPPER(AFIELDNAME); SELECT COUNT(*) INTO COUNTNUM FROM SYS_MAXKEY WHERE UPPER(TABLENAME) = TTABLENAME AND UPPER(KEYNAME) = TFIELDNAME; IF (COUNTNUM > 0) THEN UPDATE SYS_MAXKEY SET MAXKEY = MAXKEY + 1 WHERE UPPER(TABLENAME) = TTABLENAME AND UPPER(KEYNAME) = TFIELDNAME returning MAXKEY into APKVALUE; ELSE --取對應表中的最大的主鍵 值 DYNSTR := 'begin select max(' || TFIELDNAME || ') into :i_max from ' || TTABLENAME || '; end ;'; EXECUTE IMMEDIATE DYNSTR USING OUT APKVALUE; IF APKVALUE IS NULL THEN APKVALUE := 1; ELSE APKVALUE := APKVALUE + 1; END IF; --從序列中獲取要寫入sys_maxkey表的主鍵資訊 SELECT SEQ_SYS_MAXKEY.NEXTVAL INTO MAXKEYID FROM DUAL; --對取到的結果進行回寫到sys_maxkey表中 INSERT INTO SYS_MAXKEY (ID, TABLENAME, KEYNAME, MAXKEY, ) VALUES (MAXKEYID, TTABLENAME, TFIELDNAME, APKVALUE,); END IF; COMMIT; END;