亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > Oracle > 正文

oracle constraints

2024-08-29 13:53:56
字體:
來源:轉載
供稿:網友
 Oracle 的約束主要是在業務邏輯層面維護數據的完整性。主要通過程序員在應用程序中規定約束或者通過定義觸發器來維護數據完整性,最后是通過使用oracle自帶的約束來維護數據完整性。能使用oracle自帶的約束達到要求就盡量使用oracle自帶的約束,因為使用觸發器等用戶自定義約束都會影響數據庫的性能。例如:使用觸發器時會對表進行鎖定并進行表掃描或者索引掃描,這些都會降低數據庫性能和并發性。

  oracle 約束主要分為以下幾種:

not null 非空約束, unique 唯一約束, PRimary key 主鍵約束, foreign key 外鍵約束, check 約束。

  

not null 非空約束:

  創建方式:1, 建表時在列級別定義(也就是只能在定義表時將約束的定義寫在該列后面),2種方式。一種使用自定義約束名稱,一種是使用系統默認名稱。

view plaincopy to clipboardprint?
create table t   
(   
  tid     number(8) constraint NK_t1 not null,   
  tname   varchar2(10) not null  
)  
create table t
(
  tid     number(8) constraint NK_t1 not null,
  tname   varchar2(10) not null
)

view plaincopy to clipboardprint?
SQL> select t.constraint_name, t.table_name, t.status, t.deferrable from user_constraints t;   
    
CONSTRAINT_NAME TABLE_NAME                     STATUS   DEFERRABLE   
--------------- ------------------------------ -------- --------------   
NK_T1           T                              ENABLED  NOT DEFERRABLE   
SYS_C003735     T                              ENABLED  NOT DEFERRABLE   
    
SQL>   
SQL> select t.constraint_name, t.table_name, t.status, t.deferrable from user_constraints t;

CONSTRAINT_NAME TABLE_NAME                     STATUS   DEFERRABLE
--------------- ------------------------------ -------- --------------
NK_T1           T                              ENABLED  NOT DEFERRABLE
SYS_C003735     T                              ENABLED  NOT DEFERRABLE

SQL>  

             2,在表建立后對表進行修改,但是要確保表中數據沒有違反約束。

view plaincopy to clipboardprint?
SQL> alter table t modify tid not null;   
    
Table altered   
    
SQL> select t.constraint_name, t.table_name, t.status, t.deferrable from user_constraints t;   
    
CONSTRAINT_NAME TABLE_NAME                     STATUS   DEFERRABLE   
--------------- ------------------------------ -------- --------------   
SYS_C003736     T                              ENABLED  NOT DEFERRABLE   
    
SQL>   
SQL> alter table t modify tid not null;

Table altered

SQL> select t.constraint_name, t.table_name, t.status, t.deferrable from user_constraints t;

CONSTRAINT_NAME TABLE_NAME                     STATUS   DEFERRABLE
--------------- ------------------------------ -------- --------------
SYS_C003736     T                              ENABLED  NOT DEFERRABLE

SQL>  

check 約束

  創建方式:可以在表級別和列級別進行定義(既可以在列后面定義也可以在列定義完后再定義)。也是2種定義方式。

view plaincopy to clipboardprint?
SQL> create table t   
  2  (   
  3    tid     number(8) ,   
  4    tname   varchar2(10),   
  5    constraint CK_T1 check ((tid is not null) and (tid > 0))   
  6  )   
  7  /   
    
Table created   
    
SQL> alter table t add constraint CK_T2 check(tname is not null);   
    
Table altered   
    
SQL> select t.constraint_name, t.table_name, t.status, t.deferrable from user_constraints t;   
    
CONSTRAINT_NAME TABLE_NAME                     STATUS   DEFERRABLE   
--------------- ------------------------------ -------- --------------   
CK_T1           T                              ENABLED  NOT DEFERRABLE   
CK_T2           T                              ENABLED  NOT DEFERRABLE   
    
SQL>   
SQL> create table t
  2  (
  3    tid     number(8) ,
  4    tname   varchar2(10),
  5    constraint CK_T1 check ((tid is not null) and (tid > 0))
  6  )
  7  /

Table created

SQL> alter table t add constraint CK_T2 check(tname is not null);

Table altered

SQL> select t.constraint_name, t.table_name, t.status, t.deferrable from user_constraints t;

CONSTRAINT_NAME TABLE_NAME                     STATUS   DEFERRABLE
--------------- ------------------------------ -------- --------------
CK_T1           T                              ENABLED  NOT DEFERRABLE
CK_T2           T                              ENABLED  NOT DEFERRABLE

SQL>  

約束CK_T1保證tid列不能為空并且要大于0,CK_T2保證iname不能為空。check約束也可以是同一行的不同列之間的規則。

unique 約束

  創建方式:單unique規定的列只有一列時可以在列級別定義,如果unique規定的列包含多列時只能在表級別定義。

view plaincopy to clipboardprint?
SQL> create table t2   
  2  (   
  3     vid   number constraint VK_T1 unique,   
  4     vname varchar2(10),   
  5     vsex  varchar2(10),   
  6     constraint VK_T2 unique(vname,vsex)   
  7  )   
  8  /   
    
Table created   
  
SQL> select t.constraint_name, t.table_name, t.status, t.validated, t.deferrable from user_constraints t;   
    
CONSTRAINT_NAME TABLE_NAME STATUS   VALIDATED  DEFERRABLE   
--------------- ---------- -------- ---------- --------------   
VK_T1           T2         ENABLED  VALIDATED  NOT DEFERRABLE   
VK_T2           T2         ENABLED  VALIDATED  NOT DEFERRABLE   
    
SQL>   
SQL> create table t2
  2  (
  3     vid   number constraint VK_T1 unique,
  4     vname varchar2(10),
  5     vsex  varchar2(10),
  6     constraint VK_T2 unique(vname,vsex)
  7  )
  8  /

Table created

SQL> select t.constraint_name, t.table_name, t.status, t.validated, t.deferrable from user_constraints t;

CONSTRAINT_NAME TABLE_NAME STATUS   VALIDATED  DEFERRABLE
--------------- ---------- -------- ---------- --------------
VK_T1           T2         ENABLED  VALIDATED  NOT DEFERRABLE
VK_T2           T2         ENABLED  VALIDATED  NOT DEFERRABLE

SQL>  

unique約束創建的同時會產生一條索引(可能是唯一性所以也可以是非唯一性索引,這要看建表時指定該表是否在數據插入時立即檢查數據的約束):

view plaincopy to clipboardprint?
SQL> select t.index_name, t.table_name, t.uniqueness from user_indexes t;   
    
INDEX_NAME  TABLE_NAME UNIQUENESS   
----------- ---------- ----------   
VK_T1       T2         UNIQUE   
VK_T2       T2         UNIQUE  
SQL> select t.index_name, t.table_name, t.uniqueness from user_indexes t;

INDEX_NAME  TABLE_NAME UNIQUENESS
----------- ---------- ----------
VK_T1       T2         UNIQUE
VK_T2       T2         UNIQUE

由于有索引所以在創建表時可以指定索引存儲的位置和一些存儲參數。

view plaincopy to clipboardprint?
SQL> create table t2   
  2  (   
  3     vid   number constraint VK_T1 unique,   
  4     vname varchar2(10),   
  5     vsex  varchar2(10),   
  6     constraint VK_T2 unique(vname,vsex) using index tablespace indx   
  7                                         storage(initial 100k next 100k pctincrease 0)   
  8                                         nologging   
  9  )   
10  /   
    
Table created  
SQL> create table t2
  2  (
  3     vid   number constraint VK_T1 unique,
  4     vname varchar2(10),
  5     vsex  varchar2(10),
  6     constraint VK_T2 unique(vname,vsex) using index tablespace indx
  7                                         storage(initial 100k next 100k pctincrease 0)
  8                                         nologging
  9  )
10  /

Table created

指定約束索引存儲的表空間是indx表空間,初始塊大小是100k,然后對dml操作不產生日志(但是由于其他原因也會產生日志,只是相對默認的logging要少)

primary key 主鍵約束

   創建方式:primary key主要是由非空和唯一性組合而成的。一個表只能包含一個主鍵,但一個主鍵可以含有多列。

view plaincopy to clipboardprint?
SQL> create table t2   
  2  (   
  3     vid   number constraint VK_T1 unique,   
  4     vname varchar2(10),   
  5     vsex  varchar2(10),   
  6     constraint VK_T2 primary key(vname,vsex) using index tablespace indx   
  7                                         storage(initial 100k next 100k pctincrease 0)   
  8                                         nologging   
  9  )   
10  /   
    
Table created  
SQL> create table t2
  2  (
  3     vid   number constraint VK_T1 unique,
  4     vname varchar2(10),
  5     vsex  varchar2(10),
  6     constraint VK_T2 primary key(vname,vsex) using index tablespace indx
  7                                         storage(initial 100k next 100k pctincrease 0)
  8                                         nologging
  9  )
10  /

Table created

foreign key 外鍵

  創建方式:外鍵涉及的表可以有2張也可以是1張,2張的情況下一張child表中的一個字段引用的鍵必須fater表中的主鍵。約束是建立在child表中的,標示該表中的該字段中的值必須在父表中存在或者是NULL值。

view plaincopy to clipboardprint?
SQL> create table dept   
  2  (   
  3    did   number(8),   
  4    dname varchar2(20),   
  5    constraint PK_DEPT primary key (did)   
  6  )   
  7  /   
    
Table created   
    
SQL>    
SQL> create table emp   
  2  (   
  3    eid   number(8) primary key,   
  4    ename varchar2(20),   
  5    did   number(8) /*references dept(did)*/,   
  6    dname varchar2(20),   
  7    constraint FK_EMP2 foreign key(did) references dept(did)   
  8  )   
  9  /   
    
Table created  
SQL> create table dept
  2  (
  3    did   number(8),
  4    dname varchar2(20),
  5    constraint PK_DEPT primary key (did)
  6  )
  7  /

Table created

SQL>
SQL> create table emp
  2  (
  3    eid   number(8) primary key,
  4    ename varchar2(20),
  5    did   number(8) /*references dept(did)*/,
  6    dname varchar2(20),
  7    constraint FK_EMP2 foreign key(did) references dept(did)
  8  )
  9  /

Table created

由于外鍵(foreign key)由reference key(引用鍵)決定所以在對fater table進行update或者drop,delete等操作時會受到限制。具體有外鍵約束的狀態決定。

  delete on action, delete cascade, delete set null

delete on action 默認設置,如果刪除fater table表中的數據,這時oracle會鎖定字表然后進行掃描表(如果外鍵列有所以則掃描索引)然后child表中的外鍵列存在該數據則不允許刪除。

delete cascade 則把字表中的相應對應的行也刪除。

delete set null 則吧子表中的外鍵列對應的數據變成NULL.

view plaincopy to clipboardprint?
create table emp   
(   
  eid   number(8) primary key,   
  ename varchar2(20),   
  did   number(8) /*references dept(did)*/,   
  dname varchar2(20),   
  constraint FK_EMP2 foreign key(did) references dept(did) on delete set null  
)  
create table emp
(
  eid   number(8) primary key,
  ename varchar2(20),
  did   number(8) /*references dept(did)*/,
  dname varchar2(20),
  constraint FK_EMP2 foreign key(did) references dept(did) on delete set null
)  

由于對父表的reference key進行delete,update操作時候都會對child表進行鎖定然后進行掃描,所以可以在child的foreign key上建立索引。這樣就不需要對表進行鎖定了而且也減少了掃描的時間。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
成人黄色大片在线免费观看| 91久久国产精品91久久性色| 日韩av快播网址| 成人国产在线激情| 欧美午夜宅男影院在线观看| 色老头一区二区三区| 亚洲精品在线不卡| 日韩成人激情视频| 日韩网站免费观看| 91在线观看免费| 97久久久免费福利网址| 欧美激情xxxx| 成人黄色免费看| www欧美xxxx| 91网站在线免费观看| 国产精品免费网站| 国产精品入口免费视| 最近2019中文字幕在线高清| 亚洲网址你懂得| 久久精品国产一区| 91在线精品播放| 色综合久久久久久中文网| 91九色精品视频| 亚洲成人网久久久| 欧美激情a∨在线视频播放| 97人洗澡人人免费公开视频碰碰碰| 91精品在线影院| 这里精品视频免费| 日韩av手机在线| 2025国产精品视频| 国产精品久久久久久超碰| 96sao精品视频在线观看| 欧美日韩激情视频| 国产精品极品在线| 高清一区二区三区日本久| 777午夜精品福利在线观看| 日韩经典中文字幕| 91麻豆桃色免费看| 午夜欧美大片免费观看| 国产大片精品免费永久看nba| 日韩欧美国产视频| 日本精品久久久| 91精品国产亚洲| 欧美国产第二页| 久久不射电影网| 91久久国产精品91久久性色| 欧美日韩亚洲网| 日韩少妇与小伙激情| 日本不卡视频在线播放| 成人国产亚洲精品a区天堂华泰| 久久中文字幕在线视频| 色伦专区97中文字幕| 亚洲国产另类 国产精品国产免费| 久久久www成人免费精品张筱雨| 亚洲视频在线观看网站| 亚洲福利视频专区| 欧美xxxx做受欧美.88| 欧美成人免费小视频| 日韩欧美aⅴ综合网站发布| 欧美高清在线观看| 亚洲日本成人女熟在线观看| 视频在线一区二区| 日韩av在线网页| 成人激情在线播放| 久久影视电视剧凤归四时歌| 欧美另类69精品久久久久9999| 精品亚洲精品福利线在观看| 成人乱色短篇合集| 亚洲欧洲一区二区三区在线观看| 久久综合五月天| 国产97在线|亚洲| 国产综合久久久久| 国外成人免费在线播放| 2020欧美日韩在线视频| 中文字幕在线日韩| 亚洲自拍欧美另类| 国产国语刺激对白av不卡| 欧美色欧美亚洲高清在线视频| 久久久亚洲精品视频| 国产日韩在线一区| 欧美日韩精品二区| 国产精品扒开腿做| 亚洲自拍偷拍一区| 中文字幕在线看视频国产欧美在线看完整| 亚洲欧美日韩中文在线| 欧美一区二区色| 亚洲第一福利视频| 97人人做人人爱| 亚洲一区精品电影| 色偷偷噜噜噜亚洲男人的天堂| 欧美亚洲在线播放| 欧美丰满片xxx777| 亚洲午夜精品久久久久久性色| 成人国产精品一区| 538国产精品视频一区二区| 亚洲码在线观看| 国产精品第1页| 欧美日韩视频在线| 亚洲伊人久久综合| 日韩高清不卡av| 亚洲精品videossex少妇| 91丨九色丨国产在线| 久久久人成影片一区二区三区| 亚洲精品欧美一区二区三区| 91产国在线观看动作片喷水| 亚洲激情视频在线观看| 日韩av免费在线观看| 国产精品视频自拍| 国产成人精品国内自产拍免费看| 日韩av电影在线免费播放| 久久精品这里热有精品| 欧美特黄级在线| 国产精品入口免费视频一| 精品在线小视频| 日韩免费不卡av| 久久99国产精品久久久久久久久| 综合网日日天干夜夜久久| 亚洲国产精品一区二区三区| 亚洲欧洲xxxx| 国产精品户外野外| 日韩动漫免费观看电视剧高清| 久久偷看各类女兵18女厕嘘嘘| 97av在线视频免费播放| 国产精品中文久久久久久久| 日韩精品免费在线视频| 久久天天躁狠狠躁夜夜躁| 中文字幕av一区中文字幕天堂| 欧美精品激情在线观看| 欧美xxxwww| 麻豆成人在线看| 国产精品96久久久久久| 欧美网站在线观看| 日韩成人av网址| 欧美高清在线观看| 欧美成人精品一区二区| 亚洲自拍另类欧美丝袜| 国产97在线|日韩| 深夜福利一区二区| 日韩av在线不卡| 成人国产精品一区二区| 亚洲人成电影网站| 久久久久久久久91| 久久97久久97精品免视看| 亚洲欧洲自拍偷拍| 国产成人精彩在线视频九色| 国产va免费精品高清在线观看| 欧美一性一乱一交一视频| 97精品国产97久久久久久免费| 亚洲国产中文字幕久久网| 欧美最近摘花xxxx摘花| 黑人巨大精品欧美一区二区免费| 久久久97精品| 午夜精品在线视频| 亚洲欧美日韩区| 亚洲综合最新在线| 国产精品老女人精品视频| 欧美日韩另类字幕中文| 久久精品色欧美aⅴ一区二区| 国产久一一精品| 欧美猛交ⅹxxx乱大交视频| 成人黄色大片在线免费观看| 2019日本中文字幕| 欧美高清视频在线观看| 日韩av片电影专区|