[数据库] Navicat for Oracle设置唯一性和递增序列实验
這篇文章主要講述Navicat for Oracle設(shè)置唯一性約束和設(shè)置某字段為遞增序列。文章主要以圖文為主,雖然都是非常簡單基礎(chǔ)的文章,但還是希望對你有所幫助。
推薦前一篇文章:[數(shù)據(jù)庫] Navicat for Oracle基本用法圖文介紹
一. 設(shè)置唯一性
參考文章:Oracle之唯一性約束(UNIQUE Constraint)用法詳解
唯一性約束英文是Unique Constraint,它是指表中一個字段或者多個字段聯(lián)合起來能夠唯一標(biāo)識一條記錄的約束。聯(lián)合字段中,可以包含空值。
那唯一性約束與主鍵又有什么區(qū)別呢?
你可能會疑惑主鍵(Primary Key)不是唯一標(biāo)識一張表的嗎?
主鍵是所有組成主鍵的列都不能包含空值,而如果唯一性約束由多列組成,其中的部分列可以包含空值。同時,注意Oracle中不容許在相同列上既創(chuàng)建主鍵又創(chuàng)建唯一性約束。
例如學(xué)生表Student(id, stu_id, stu_name, sex, email, year),其中主鍵是學(xué)生學(xué)號(stu_id, year),假設(shè)該表學(xué)生每年都需要錄入一遍數(shù)據(jù),所以兩個字段構(gòu)成主鍵。
同時為了方便遍歷,序號id也需要設(shè)置不同,這時候就需要id設(shè)置為唯一性。
唯一性約束可以在創(chuàng)建表時或使用ALTER TABLE語句創(chuàng)建。
創(chuàng)建唯一性約束的SQL語句如下:
ALTER TABLE table_name DROP CONSTRAINT constraint_name; 使用Navicat for Orcale方法如下:
兩種方法均可設(shè)置唯一性約束:
alter table T_USER_INFO add constraint u_id unique(ID);
alter table T_USER_INFO? add unique(ID);
此時查看表T_USER_INFO結(jié)構(gòu)如下所示,其中用戶名為主鍵:
同樣查看唯一性可以看到剛設(shè)置的序號ID:
當(dāng)修改表T_USER_INFO中ID字段,出現(xiàn)相同值或插入數(shù)據(jù)ID已經(jīng)存在的時候,會報錯:
二. 設(shè)置遞增序列
前面講述的插入序號ID,但是數(shù)據(jù)庫中序號肯定會很多,如何在插入ID數(shù)據(jù)過程中更方便避免重復(fù)的插入呢?這就涉及到了設(shè)置ID為遞增序列的方法。
Navicat for Orcale不像MySQL只需要勾選遞增序列即可,它需要SQL語句來設(shè)置。所以這部分內(nèi)容也非常重要,希望對你有所幫助。
主要步驟包括:
? ? ? ? 1) 設(shè)置序列
? ? ? ? 2) 設(shè)置對應(yīng)序列和表的觸發(fā)器
? ? ? ? 3) 插入數(shù)據(jù)時使用對應(yīng)的觸發(fā)器
具體方法如下:
第一部分 設(shè)置序列
1.通過點擊"其他=》序列"可以操作序列:
2.點擊進去后可以設(shè)計序列、新建序列、刪除序列。
3.同樣可以通過代碼增加序列,對應(yīng)上面的表T_USER_INFO用戶表。
序列參數(shù)詳見:oracle中創(chuàng)建序列以及序列使用注意事項
CREATE SEQUENCE User_Info_SEQ minvalue 1 maxvalue 9999999999999999999 increment by 1 start with 1;
4.點擊新建的序列User_Info_SEQ后可以發(fā)現(xiàn)具體的序列:
第二部分 設(shè)置觸發(fā)器
5. 然后設(shè)置對應(yīng)表T_USER_INFO中字段ID的觸發(fā)器,實現(xiàn)在向表中插入數(shù)據(jù)前自動插入自增長的序列。
CREATE OR REPLACE TRIGGER Trigger_User BEFORE INSERT ON T_USER_INFO for each row when(NEW.ID is NULL) begin select User_Info_Seq.Nextval into :NEW.ID from dual; end; 創(chuàng)建成功如下圖所示,注意不能缺少when(NEW.ID is NULL),因為在插入數(shù)據(jù)時會缺省ID這個值,讓觸發(fā)器自動補充。
6.查看表T_USER_INFO結(jié)構(gòu)可以查看對應(yīng)的觸發(fā)器:
但有可能會報編譯錯誤[Err] ORA-24344: success with compilation error。其原因是表的所有列名都需要大寫,也可以手動添加“更新欄位”,否則如圖雖然有增加觸發(fā)器,但是更新欄位為空,所以這個插入是不成功的,插入時也不會觸發(fā)主鍵的序列。
第三部分 插入數(shù)據(jù)
7.插入數(shù)據(jù)
insert into T_USER_INFO (USERNAME,PWD,STATUS,DW_NAME,DW_CODE) values('eastmount','000000','2','軟件學(xué)院','08111003'); 此時能插入數(shù)據(jù),其中字段ID會自動添加。
如果報錯[Err] ORA-00001: unique constraint (GUICAI.SYS_C0017014) violated,如下圖所示。這可能是因為表中設(shè)置了唯一性ID,出現(xiàn)重復(fù)數(shù)據(jù)的現(xiàn)象。如果不能設(shè)置唯一性約束且需要保持唯一性,推薦使用sys_guid()函數(shù)產(chǎn)生唯一編碼。其實質(zhì)想法是獲取表中最大ID值再自動加1。
參考:[OARCLE]在Oracle中生成GUID類型--SYS_GUID()函數(shù)
test01(ID varchar2 32, NAME varchar2 20)
insert into "test01" values (sys_guid(),'張三');
如果報錯:[Err] ORA-00001: unique constraint ?violated
它是因為在插入數(shù)據(jù)過程中ID出現(xiàn)重復(fù)數(shù)據(jù)違背了唯一性約束,可以修改ID值,或設(shè)置增大序列為最大值。即: start? with ?5000, 但連續(xù)插入兩次時就會成功插入。
最后我刪除了唯一性約束,僅僅通過觸發(fā)器插入遞增序列,防止violated錯誤。
參考: Oracle實現(xiàn)類似SQL SERVER列自增長功能-jssg_tzw
? ? ? ? ?? Oracle中添加自動編號的序列-左What
? ? ? ? ?? oracle中字段遞增的實現(xiàn)-百度文庫
? ? ? ? ?? oracle中DB設(shè)計時id唯一性(或者自增)怎么設(shè)置
? ? ? ? ??SYS_GUID()與sequence的比較
? ? ? ? ??oracle數(shù)據(jù)庫的主鍵遞增問題,插入數(shù)據(jù)問題
最后還是希望文章對你有所幫助,這篇文章主要是我關(guān)于Navicat for Orcale軟件的使用方法,包括設(shè)置唯一性和遞增序列的實驗,主要通過圖文的形式進行講述,可能這個很簡單的問題復(fù)雜化了,但是對初學(xué)者來說還是有一定幫助的,高手勿噴~
最近真的好忙,昨天就睡了4個小時,現(xiàn)在又熬夜到凌晨五點了,但是每每分享一篇博客之后,感覺都非常興奮或開心,有些東西不能言表,開心就好!
(By:Eastmount 2016-04-11 清晨5點 ? http://blog.csdn.net/eastmount/ )
總結(jié)
以上是生活随笔為你收集整理的[数据库] Navicat for Oracle设置唯一性和递增序列实验的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [python] 常用正则表达式爬取网页
- 下一篇: C#调用百度地图API入门解决BMap未