您現在的位置: 365建站網 > 365學習 > 什么是數據庫主鍵約束 primary key、外鍵約束 foreign key、唯一約束unique)

什么是數據庫主鍵約束 primary key、外鍵約束 foreign key、唯一約束unique)

文章來源:365jz.com     點擊數:1965    更新時間:2018-10-25 08:59   參與評論

注意:

A.表中有數據不能創建約束

B.視圖下設置后,要點擊保存(只有保存后在1.jpg才看的到)


2.jpg



c   別忘了,點刷新,才會出來呀!

3.jpg

一、五種約束

如果DML操作所涉及數據違反了已定義的約束,則數據庫系統將拒絕執行這樣的操作。

Oracle數據庫中,約束具體包括非空(NOT NULL)約束、唯一鍵(UNIQUE)約束、主鍵(PRIMARY KEY)約束、外鍵(FOREIGN KEY)約束和檢查(CHECK)約束五種。

和數據表類似,約束也屬于數據庫對象,可以在建表的同時創建其相關約束,也可以在建表后單獨添加;可以由用戶命名,也可以由系統按照默認格式自動對約束進行命名;按照約束的定義位置,又可以分為表級約束和字段級約束兩種。

建表的同時創建約束的的語法格式為:

其中,column_constraint為字段級約束,字段級約束在字段定義時一并給出,也只能約束其所屬的單個字段;table_constraints為表級約束,與表中的字段并列定義,可以約束單個或多個字段。

1、非空約束(只能在字段級定義)

例子:

查詢數據字典視圖user_constraints可得到其具體名稱,SQL語句如下:

2、唯一性約束(列中最多有一個空值)unique

Oracle會自動為唯一性約束的字段創建相應的唯一性索引。唯一性約束既可以在字段級定義、也可以在表級定義。

如果要在兩個或兩個以上字段上定義聯合唯一鍵(字段組合不允許出現空值),就只能定義為表級約束了,例如:


alter table Account
    add constraint AK_AccountName    --約束名
    unique (Account_Name)    -- 列名

3、主鍵約束(非空且唯一)primary key

只允許一個主鍵,主鍵可以是單個字段或多字段的組合(聯合主鍵),Oracle會自動為主鍵字段創建對應的唯一性索引。主鍵約束既可以在字段級定義、也可以在表級定義。

區別:主鍵是唯一的。

聯合主鍵只能定義為表級約束:



4.jpg


alter table t_group  

  alter column id int not null      --修改字段類型

go



alter table t_group

  add constraint pk_group_Id --字段創建主鍵約束

  primary key(id)

go


4、外鍵約束 foreign key

表級、字段級均可。

外鍵約束的特征:

(1)子表外鍵字段的值必須在主表被參照字段值得范圍內,或者為NULL;

(2)外鍵參照的必須是主表的主鍵或唯一鍵(??);

(3)主表主鍵/唯一鍵被子表參照時,主表相應記錄不允許被刪除。

使用外鍵約束的相關原則:

(1)創建數據表時,先創建主表,后創建子表;刪除表的順序相反;

(2)添加數據時,先向主表中添加/插入記錄,后向子表添加記錄;刪除數據操作順序相反;

(3)修改數據(UPDATE)的情況要復雜一些,通常使用觸發器實現。

外鍵約束可以和主鍵約束同時使用:

外鍵約束也可能構建于同一個表內部的兩個字段之間:


外鍵既能確保數據完整性,也能表現表之間的關系。添加了外鍵之后,插入引用表的記錄要么必須被引用表中被引用列的某條記錄匹配,要么外鍵列的值必須設置為NULL。


  外鍵和主鍵不一樣,每個表中的外鍵數目不限制唯一性。在每個表中,每一有-~253個外鍵。唯一的限制是一個列只能引用一個外鍵。一個列可以被多個外鍵引用。


如果表A的主關鍵字是表B中的字段,則該字段稱為表B的外鍵,表A稱為主表,表B稱為從表。外鍵是用來實現參照完整性的。


比如說:



create table t_group (   
    id int not null,   
    name varchar(30),   
    primary key (id)   
);  
 
insert into t_group values (1, 'Group1');   
insert into t_group values (2, 'Group2');
 
create table t_user (   
    id int not null,   
    name varchar(30),   
    groupid int,   
    primary key (id),   
    foreign key (groupid) references t_group(id) on delete cascade on update cascade  
);  
 
insert into t_user values (1, 'qianxin', 1); --可以插入   
insert into t_user values (2, 'yiyu', 2);    --可以插入   
insert into t_user values (3, 'dai', 3);    --錯誤,無法插入,用戶組3不存在,與參照完整性約束不符 
 
insert into t_user values (1, 'qianxin', 1);   
insert into t_user values (2, 'yiyu', 2);   
insert into t_user values (3, 'dai', 2);   
delete from t_group where id=2;              --導致t_user中的2、3記錄級聯刪除   
update t_group set id=2 where id=1;          --導致t_user中的1記錄的groupid級聯修改為2


主鍵表和外鍵表的理解

(1)以公共關鍵字作主鍵的表為主鍵表(父表,主表)

(2)以公共關鍵字作外鍵的表為外鍵表(從表,外表)

 

舉個例子:

這里有2張表(student和depart)學生表和院系表,這里的字段departNum就是學生表的外鍵,這里的外鍵表是學生表,主鍵表是院系表。

 

外鍵的作用

各種書籍和網上的資料大多都是抽象空洞的解釋:保證數據的完整性和一致性。

個人對此的理解與接下來的外鍵約束一起講。


Mysql 下,外鍵設置:

on delete  規則:

1、CASCADE:級聯

   (1)所謂的級聯刪除,就是刪除主鍵表的同時,外鍵表同時刪除。

   (2)以上面的例子將就是,假如院系表中的某個院系被刪除了,那么在學生表中要想查詢這個被刪除的院系號所對應的院信息就會報錯,因為已經不存在這個系了,所以,刪除院系表(主鍵表)時必須刪除其他與之關聯的表,這里就說明了外鍵的作用,保持數據的一致性、完整性。當然反過來講,你刪除學生表中的記錄,并不影響院系表中的數據,你查詢院系號也能正確查詢。所以刪除外鍵表中的數據并不影響主鍵表。


2、NO ACTION(非活動,默認)、RESTRICT:約束/限制
  當取值為No Action或者Restrict時,則當在主鍵表中刪除對應記錄時,首先檢查該記錄是否有對應外鍵,如果有則不允許刪除。(即外鍵表約束主鍵表)
3、SET NULL
    當取值為Set Null時,則當在主鍵表中刪除對應記錄時,首先檢查該記錄是否有對應外鍵,如果有則設置子表中該外鍵值為null(,一樣是外鍵表約束主鍵表,不過這就要求該外鍵允許取null)。

NO ACTION和RESTRICT的區別:只有在及個別的情況下會導致區別,前者是在其他約束的動作之后執行,后者具有最高的優先權執行。

實際應用

對象模型中的數據如下:

package org.model;  
  
public class Student {  
private String stuNum;  
private String stuName;  
<span style="color:#FF0000;">private Depart depart;</span>  
public String getStuNum() {  
    return stuNum;  
}  
public String getStuName() {  
    return stuName;  
}  
public Depart getDepart() {  
    return depart;  
}  
public void setStuNum(String stuNum) {  
    this.stuNum = stuNum;  
}  
public void setStuName(String stuName) {  
    this.stuName = stuName;  
}  
public void setDepart(Depart depart) {  
    this.depart = depart;  
}  
  
}

 

這里設計對象模型時的屬性并不是設計成departNum這個外鍵,而是整個Depart對象,這樣做的好處是在查詢時,就不用通過外鍵或者連接查詢再多查詢一次

 

若要通過外鍵查詢:

  

Query query=session.createQuery("from Student as stud where stud.depart.departNum=:num");  
query.setString("num","890");



5、檢查約束 CHECK

表級、字段級均可。

檢查約束的條件表達式中不允許出現如下內容:
- currval, nextval, level, rownum等偽劣
- sysdate, uid, user, userenv等函數
- 對其它字段值的引用

其中, uid, user, userenv函數分別用于獲取當前數據庫用戶ID,用戶名及客戶端計算機信息,如:

CHECK約束約束可以和一個列關聯,也可以和一個表關聯,因為它們可以檢查一個列的值相對于另外一個列的值,只要這些列都在同一個表中以及值是在更新或者插入的同一行中。CHECK約束還可以用于檢查列值組合是否滿足某一個標準。


  可以像使用where子句一樣的規則來定義CHECK約束。CHECK約束條件的示例如下:


目標


SQL


限制Month列為合適的數字


BETWEEN 1 AND 12


正確的SSN格式


LIKE'[0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9]'


限制為一個快遞公司的特定列表


IN('UPS','Fed Ex',EMS')


價格必須為正數


UnitPrice >= 0


引用同一行中的另外一列


ShipDate >= OrderDate


  上面給出的列表只是一小部分,而條件實際上市無限多的。幾乎所有可以放到where子句的條件都可以放到該約束中。而且和其他選擇(規則和觸發器)相比,CHECK約束執行速度更快。


  在已存在的表中添加一個CHECK約束:


alter table Account


    add constraint CN_AccountAge


    check 


    (Account_Age > 18);    -- 插入年齡必須大于18


  如果此時視圖添加一條不滿足的記錄,將報如下錯誤:


insert into Accountvalues (22,'洪',17)


消息547,級別16,狀態0,第1 行


INSERT 語句與 CHECK 約束"CN_AccountAge"沖突。該沖突發生于數據庫"Nx",表"dbo.Account", column 'Account_Age'。


語句已終止。


二、約束管理

1、查看約束

如要查看當前用戶的所有約束,可查詢用戶字典視圖user_constrains:

其返回結果中的"CONSTRAINT_TYPE"字段以縮寫的方式標明約束條件的具體類型:"P"代表主鍵約束、 代表外鍵約束、"U"代表唯一鍵約束,檢查和非空約束均使用"C"標明。

如果想知道約束建立在哪個字段上,則需要查詢用戶字典視圖user_cons_columns:

2、添加約束(添加非空約束格式特別)

建表后添加非空約束的格式有些特別——必須使用MODIFY子句添加,實際上是修改了整個字段的定義(也可以同時修改字段類型、缺省值等),例如:

3、刪除約束

其中,CASCADE用于指定刪除當前約束的級聯約束。

刪除主鍵約束還有另外一種方式,其語法格式為:

刪除約束時,如果還存在與該約束相關聯的其他約束(如外鍵/關聯)稱為級聯約束,則刪除操作會失敗,此時可使用CASCADE子句將其他關聯約束一并刪除。如:

刪除表中字段時,如果該字段處于多字段聯合約束條件(聯合主鍵、聯合唯一鍵、存在參照當前字段的外鍵)中,則刪除會失敗,此時可使用CASCADE CONSTRAINT子句將與該字段相關的約束一并刪除。例如:

4、禁用約束

在ALTER TABLE語句中,還可以使用DISABLE CONSTRAINT子句禁用已有約束,即關閉數據校驗功能,還可以使用CASCADE選項將相關聯的約束一并禁用。其語法格式如下:

相應地,可以使用ENABLE CONSTRAINT子句啟用先前被禁用的約束,例如:

和關閉約束操作的情形有所不同,此時無法再使用CASCADE選項一并啟用相關聯的其它約束。


如對本文有疑問,請提交到交流論壇,廣大熱心網友會為你解答??! 點擊進入論壇


發表評論 (1965人查看,0條評論)
請自覺遵守互聯網相關的政策法規,嚴禁發布色情、暴力、反動的言論。
用戶名: 驗證碼: 點擊我更換圖片
最新評論
------分隔線----------------------------
自拍偷拍福力视频,偷拍国际精品,麻豆一区福利电影,国产网红视频午夜福利,se视频大全,久久国产AV影院 国产毛片不卡野外视频| 免费追剧大全电视剧网站| 玩丰满高大邻居人妻| 偷窥熟女大屁股对白视频| 久久久久亚洲av无码专区首页| 爆乳汗だく肉感レズビアン| 蹂躏办公室波多野在线播放| 苏若雪沈浪全文免费阅读| 日韩欧美在线综合网| 香港三级日本三级三级韩级| 人妻熟女少妇中文字幕| 无码专区久久综合久中文字幕| 中国Vide0SeS12一15| 秋霞韩国三级在线观看| 开心激情五月天| 黑人无套内谢中国少妇| 熟妇人妻午夜寂寞影院| 超帅小伙被ktv直男少爷口| 乌克兰肥妇黑毛bbw| 被窝网| 亚va中文字幕无码毛片| 中文人妻AV大区中文不卡| 亚洲超清无码制服丝袜无广告| 又黄又好看乡村小说| 国产午夜福利片在线播放| 免费网站看v片在线无遮挡| 一区二区三区| 人妻丰满熟妇av无码区| baoyu.tv.777尤物| 男人疯狂进女人下部视频| 女邻居丰满的奶水在线观看| http://www.specialonesfootballclubs.com