1. 程式人生 > >Oracle資料庫主鍵值生成的兩種解決方案

Oracle資料庫主鍵值生成的兩種解決方案

解決方案一:使用序列和觸發器實現(推薦)

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;