由於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作為一個主關鍵字不是一個很好主意,除非是在一個並行的環境里或者希望避免使用管理序列生成器的情況下。
