Navicat for Oracle設置唯一性和遞增序列


[數據庫] Navicat for Oracle基本用法圖文介紹

一. 設置唯一性

參考文章:Oracle之唯一性約束(UNIQUE Constraint)用法詳解
唯一性約束英文是Unique Constraint,它是指表中一個字段或者多個字段聯合起來能夠唯一標識一條記錄的約束。聯合字段中,可以包含空值。

那唯一性約束與主鍵又有什么區別呢?
你可能會疑惑主鍵(Primary Key)不是唯一標識一張表的嗎?
主鍵是所有組成主鍵的列都不能包含空值,而如果唯一性約束由多列組成,其中的部分列可以包含空值。同時,注意Oracle中不容許在相同列上既創建主鍵又創建唯一性約束。

例如學生表Student(id, stu_id, stu_name, sex, email, year),其中主鍵是學生學號(stu_id, year),假設該表學生每年都需要錄入一遍數據,所以兩個字段構成主鍵。
同時為了方便遍歷,序號id也需要設置不同,這時候就需要id設置為唯一性。

唯一性約束可以在創建表時或使用ALTER TABLE語句創建。
創建唯一性約束的SQL語句如下:

[sql]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. ALTER TABLE table_name    
  2. ADD CONSTRAINT constraint_name    
  3. UNIQUE (column1, column2, ... , column_n);   

刪除唯一性約束的SQL語句如下:

[sql]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. ALTER TABLE table_name    
  2. DROP CONSTRAINT constraint_name;    

使用Navicat for Orcale方法如下:


兩種方法均可設置唯一性約束:
alter table T_USER_INFO add constraint u_id unique(ID);
alter table T_USER_INFO  add unique(ID);


此時查看表T_USER_INFO結構如下所示,其中用戶名為主鍵:


同樣查看唯一性可以看到剛設置的序號ID:


當修改表T_USER_INFO中ID字段,出現相同值或插入數據ID已經存在的時候,會報錯:

 

 

二. 設置遞增序列

前面講述的插入序號ID,但是數據庫中序號肯定會很多,如何在插入ID數據過程中更方便避免重復的插入呢?這就涉及到了設置ID為遞增序列的方法。
Navicat for Orcale不像MySQL只需要勾選遞增序列即可,它需要SQL語句來設置。所以這部分內容也非常重要,希望對你有所幫助。

主要步驟包括:
        1) 設置序列
        2) 設置對應序列和表的觸發器
        3) 插入數據時使用對應的觸發器
具體方法如下:

第一部分 設置序列
1.通過點擊"其他=》序列"可以操作序列:

 

 

2.點擊進去后可以設計序列、新建序列、刪除序列。


3.同樣可以通過代碼增加序列,對應上面的表T_USER_INFO用戶表。
序列參數詳見:oracle中創建序列以及序列使用注意事項

[sql]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. CREATE SEQUENCE User_Info_SEQ    
  2. minvalue 1    
  3. maxvalue 9999999999999999999    
  4. increment by 1    
  5. start with 1;    


4.點擊新建的序列User_Info_SEQ后可以發現具體的序列:


第二部分 設置觸發器
5. 然后設置對應表T_USER_INFO中字段ID的觸發器,實現在向表中插入數據前自動插入自增長的序列。

[sql]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. CREATE OR REPLACE TRIGGER Trigger_User      
  2. BEFORE INSERT ON T_USER_INFO      
  3.     for each row      
  4.     when(NEW.ID is NULL)    
  5.     begin      
  6.         select User_Info_Seq.Nextval into :NEW.ID from dual;      
  7.     end;    

創建成功如下圖所示,注意不能缺少when(NEW.ID is NULL),因為在插入數據時會缺省ID這個值,讓觸發器自動補充。


6.查看表T_USER_INFO結構可以查看對應的觸發器:

但有可能會報編譯錯誤[Err] ORA-24344: success with compilation error。其原因是表的所有列名都需要大寫,也可以手動添加“更新欄位”,否則如圖雖然有增加觸發器,但是更新欄位為空,所以這個插入是不成功的,插入時也不會觸發主鍵的序列。


第三部分 插入數據
7.插入數據

[sql]  view plain  copy
 
 在CODE上查看代碼片派生到我的代碼片
  1. insert into T_USER_INFO   
  2.     (USERNAME,PWD,STATUS,DW_NAME,DW_CODE)   
  3. values('eastmount','000000','2','軟件學院','08111003');  

此時能插入數據,其中字段ID會自動添加。


如果報錯[Err] ORA-00001: unique constraint (GUICAI.SYS_C0017014) violated,如下圖所示。這可能是因為表中設置了唯一性ID,出現重復數據的現象。如果不能設置唯一性約束且需要保持唯一性,推薦使用sys_guid()函數產生唯一編碼。其實質想法是獲取表中最大ID值再自動加1。

 

參考:[OARCLE]在Oracle中生成GUID類型--SYS_GUID()函數
test01(ID varchar2 32, NAME varchar2 20)
insert into "test01" values (sys_guid(),'張三');

 


如果報錯:[Err] ORA-00001: unique constraint  violated
它是因為在插入數據過程中ID出現重復數據違背了唯一性約束,可以修改ID值,或設置增大序列為最大值。即:start with 5000,但連續插入兩次時就會成功插入。
最后我刪除了唯一性約束,僅僅通過觸發器插入遞增序列,防止violated錯誤。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM