標籤:
由於oracle中是沒有自動成長的的,需要自己去進行寫觸發器等方式去進行設定:
找了一下他人寫的,有兩種方法可以設定主鍵,一種是自增長主鍵,另一種就是產生唯一序列。
一、自增長主鍵
我建立一個使用者的資訊表
-- Create table
create table USERINFO
(
USERNO NUMBER not null,
USERNAME NVARCHAR2(20),
USERPWD NVARCHAR2(20)
)
tablespace MYPRODUCT
pctfree 10
initrans 1
maxtrans 255
storage
(
initial 64K
next 1M
minextents 1
maxextents unlimited
);
-- Create/Recreate primary, unique and foreign key constraints
alter table USERINFO
add constraint USERNO primary key (USERNO)
using index
tablespace MYPRODUCT
pctfree 10
initrans 2
maxtrans 255
storage
(
initial 64K
next 1M
minextents 1
maxextents unlimited
);
其實上面你也可以用plSql進行圖介面設定,我就是這樣做的,為了學習,將其產生的sql代碼進行複製後貼在這裡。
主要是為了以後的學習,和供他人的參考。
下面是我的進行設定觸發器的sql語句:
create sequence SEQ_Userinf start with 1 increment by 1
nomaxvalue
nominvalue
nocache;
CREATE OR REPLACE TRIGGER tg_test
BEFORE INSERT ON Userinfo
FOR EACH ROW WHEN (new.userNo is null)
begin
select SEQ_Userinf.nextval into:new.userNO from dual;
end;
進行插入語句:
insert into userinfo(userName,userpwd) values(‘d‘,‘d‘);
我表裡是有一個資料,第一次插入的時候回出來錯誤的對話方塊,第二次就可以了
對上面進解釋:
- 再建一個序列SEQ_Userinf
create sequence SEQ_Userinf
minvalue 1 --最小值
nomaxvalue --不設定最大值
start with 1 --從1開始計數
increment by 1 --每次加1個
nocycle --一直累加,不迴圈
nocache; --不建緩衝區
執行完後可以看一下結構:
第二種、唯一序列
SYS_GUID() 產生32位的唯一編碼。
序列產生器所產生的數字只能保證在單個執行個體裡是唯一的,這就不適合將它用作並行或者遠程環境裡的主關鍵字,因為各自環境裡的序列可能會產生相同的數字,從而導致衝突的發生。SYS_GUID會保證它建立的標識符在每個資料庫裡都是唯一的。
此外,序列必須是DML陳述式的一部分,因此它需要一個到資料庫的往返過程(否則它就不能保證其值是唯一的)。SYS_GUID源自不需要對資料庫進行訪問的時間戳記和機器標識符,這就節省了查詢的消耗。
很多應用程式都依靠序列產生器來建立資料行的主關鍵字,這些資料行沒有一個明顯的主值,這也就是說,在這樣的資料集裡一條記錄的建立就會讓資料列發生改變。因此,管理員可能會對在表格中將SYS_GUID用作主關鍵字而不使用序列數感興趣。這在對象在不同機器的不同資料庫裡產生以及需要在後來合并到一起的情況下很有用。
使用SYS_GUID或者序列會在資料庫使用周期裡的某些地方造成效能上的消耗;問題就是在哪裡。對於SYS_GUID而言,效能上的影響在查詢時間和建立時間上(在表格裡要建立更多的塊和索引以容納資料)。對序列而言,效能上的影響在查詢期間,在這個時候,SGA序列的緩衝區被用光。在預設情況下,一個序列一次會緩衝20個值。如果資料庫沒有使用這些值就關閉了,它們就會被丟失。
SYS_GUID產生的值的另一個顯著的不足之處是,管理這些值會變得困難得多。你必須(手動)輸入它們或者通過指令碼來填充它們,或者將它們作為Web參數來傳遞。出於這些原因,將SYS_GUID作為一個主關鍵字不是一個很好主意,除非是在一個並行的環境裡或者希望避免使用管理序列產生器的情況下。
oracle中如何設定主鍵並且讓其自動成長