日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

数据库完整性约束

發布時間:2025/7/14 数据库 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据库完整性约束 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

完整性約束

????????? ——數據庫完整性約束簡介

  • 理解數據庫完整性約束的作用;
  • 理解數據庫中的各種約束的作用。

?

  • 完整性約束是保證用戶對數據庫所做的修改不會破壞數據的一致性,是保護數據正確性和相容性的一種手段.

?

  • 維護完整性
  • 在一個DBMS之中,為了能夠維護數據庫的完整性,必須能夠提供以下的幾種支持:

提供定義完整性約束條件機制

在數據表上定義規則,這些規則是數據庫中的數據必須滿足的語義約束條件;

提供完整性檢查的方法

在更新數據庫時檢查更新數據是否滿足完整性約束條件;

違約處理

DBMS發現數據違反了完整性約束條件后要采取的違約處理行為,如拒絕(NO ACTION)執行該操作,或者級聯(CASCADE)執行其他操作。

  • 主要約束分類

開發之中可以使用以下的五種約束進行定義:

非空約束:

如果使用了非空約束的話,則以后此字段的內容不允許設置成null;

唯一約束:

即:此列的內容不允許出現重復;

主鍵約束:

表示一個唯一的標識,例如:人員ID不能重復,且不能為空;

檢查約束:

用戶自行編寫設置內容的檢查條件;

-外鍵約束(參照完整性約束):

是在兩張表上進行的關聯約束,加入關聯約束之后就產生父子的關系。

隱式約束

例如數據類型

?

—— 非空約束:NK

  • 在正常情況下,NULL是每個屬性的合法數據值。如果說現在某個字段不能為NULL,且必須存在數據,那么就可以依靠非空約束來進行控制,這樣在數據更新時,此字段的內容出現NULL時就會產生錯誤。
  • 非空約束不允許字段為null
  • 非空約束出現錯誤時會提示完整的錯誤位置。
  • 使用非空約束:只需要在定義列的時候后面增加一個NOT NULL即可.
    • 定義member表,其中姓名不允許為空

DROP TABLE member PURGE ;

CREATE TABLE member(

?? mid???? NUMBER?? ,

??? name??? VARCHAR2(200)?? NOT NULL

) ;

    • member表中插入數據,name欄位不能為空

INSERT INTO member(mid,name) VALUES(1,'wendy')

?

—— 唯一約束:UKCONSTRAINT子句

唯一約束,CONSTRAINTconstraint約束)

  • 唯一約束(UNIQUE,簡稱UK)表示的是在表中的數據不允許出現重復的情況
  • 唯一約束可以設置NULL
  • 唯一約束的列不允許重復
  • 只需要在定義列的時候后面增加一個UUNIQUE即可.
    • 定義member表,其中姓名不允許為空

DROP TABLE member PURGE ;

CREATE TABLE member(

??? mid???? NUMBER?? ,

??? name??? VARCHAR2(200)?? NOT NULL ,

??? email?? VARCHAR2(50)??? UNIQUE

) ;

向表中添加數據:

INSERT INTO member(mid,name,email) VALUES(1,'t','z@qq.com')

INSERT INTO member(mid,name,email) VALUES(2,'w','z@qq.com')

當添加第二個數據時候出現錯誤:ORA-00001: 違反唯一約束條件 (SCOTT.SYS_C0011099)

  • 因為約束在數據庫中也是一個對象,每個對象都有自己的名字,如果用戶沒有指定名字,那么就由系統動態分配一個,所以如上出現的錯誤是SYS_C0011099
  • 對于約束的名字,建議寫法:“約束簡寫_字段名”

為唯一約束指定一個名字

CONSTRAINT uk_email UNIQUE(email)

DROP TABLE member PURGE ;

CREATE TABLE member(

??? mid???? NUMBER?? ,

??? name??? VARCHAR2(200)??? NOT NULL ,

??? email?? VARCHAR2(50)?,

??? CONSTRAINT uk_email????? UNIQUE (email)

) ;

唯一約束是不受空類型控制.

如下兩條記錄都可以執行

INSERT INTO member(mid,name,email) VALUES(1,'t',null)

INSERT INTO member(mid,name,email) VALUES(2,'w',null)

?

主鍵約束:PK

?

  • 主鍵約束:PK
    • 如果一個字段即要求唯一,又不能設置為null,則可以使用主鍵約束主鍵約束 = 非空約束 + 唯一約束),
    • 主鍵約束使用PRIMARY KEY(簡稱PK進行指定.

在member表中的mid字段應該表示一個成員的唯一編號,

而這個編號即不能為空,也不能重復。

設置member表中的mid為主鍵

DROP TABLE member PURGE ;

CREATE TABLE member(

??? mid???? NUMBER????????? PRIMARY KEY ,

??? name??? VARCHAR2(200)?? NOT NULL ,

??? email?? VARCHAR2(50)?,

??? CONSTRAINT uk_email UNIQUE (email)

) ;

指定主鍵約束的名稱

DROP TABLE member PURGE ;

CREATE TABLE member(

??? mid???? NUMBER?????? ,

??? name??? VARCHAR2(200)?? NOT NULL ,

??? email?? VARCHAR2(50)?,

??? CONSTRAINT pk_mid PRIMARY KEY (mid) ,

??? CONSTRAINT uk_email UNIQUE (email)

) ;

?

  • 復合主鍵
    • 在實際的開發之中,一般在一張表中只會設置一個主鍵,但是也允許為一張表設置多個主鍵,這個時候將其稱為復合主鍵。在復合主鍵中,只有兩個主鍵字段的內容完全一樣,才會發生違反約束的錯誤

建議使用復合主鍵

?

?? 檢查約束:CK

  • 檢查約束指的是對數據增加的條件過濾,表中的每行數據都必須滿足指定的過濾條件。
  • 在進行數據更新操作時,如果滿足檢查約束所設置的條件,數據可以成功更新,如果不滿足,則不能更新,
  • SQL語句中使用CHECK(簡稱CK)設置檢查約束的條件
  • 檢查約束會設置多個過濾條件,所以檢查約束過多時會影響數據更新性能
  • member表中增加age字段(年齡范圍是0~200歲)和sex字段(只能是男或女)

DROP TABLE member PURGE ;

CREATE TABLE member(

??? mid???? NUMBER?????? ,

??? name??? VARCHAR2(200)?? NOT NULL ,

??? email?? VARCHAR2(50)?,

??? age???? NUMBER????????? CHECK (age BETWEEN 0 AND 200) ,

??? sex???? VARCHAR2(10) ,

??? CONSTRAINT pk_mid_name PRIMARY KEY (mid,name) ,

??? CONSTRAINT uk_email UNIQUE (email) ,

??? CONSTRAINT ck_sex?? CHECK (sex IN ('',''))

) ;

?

-外鍵約束:FK(重要)

  • 級聯操作:ON DELETE CASCADEON DELETE SET NULL
  • 使用外鍵約束后刪除表時應先刪除子表再刪除父表;
  • 在進行外鍵設置的時候,對應的字段,在父表中必須是主鍵或是唯一約束.
  • 如果A表和B表被設置為互為外鍵,那么一張表都無法刪除.
    • 這個時候只能強制刪除:DROP TABLE member CASCADE CONSTRAINT;
    • 不建議使用,在設計表的時候就應該考慮好先后關系
  • 外鍵約束的產生分析
    • 例如,現在公司要求每一位成員為公司發展提出一些更好的建議,并且希望將這些建議保存在數據表之中,那么根據這樣的需求,可以設計出如圖所示的設計模型。
    • 一個成員可以提出多個建議,這是一個一對多的關系.
    • 設計出了兩張數據表,兩張表的作用如下:
      • 人員表:用于保存成員的基本信息(編號、姓名);
      • 建議表:保存每一個成員提出的建議內容,所以在此表之中保存在了一個成員編號,即:通過此成員編號就可以和成員表進行數據的關聯。

建立member和advice表

DROP TABLE member PURGE ;

DROP TABLE advice PURGE ;

CREATE TABLE member(

??? mid???? NUMBER?????? ,

??? name??? VARCHAR2(200)?? NOT NULL ,

??? CONSTRAINT pk_mid PRIMARY KEY (mid)

) ;

CREATE TABLE advice(

??? adid???? NUMBER?????? ,

??? content??? CLOB?? NOT NULL ,

??????? mid???? NUMBER,

??? CONSTRAINT pk_adid PRIMARY KEY (adid)

) ;

增加一組正確的數據;

WENDY提出了2個意見,GAGA提出了3個意見

INSERT INTO member(mid,name) VALUES(1,'WENDY');

INSERT INTO member(mid,name) VALUES(2,'GAGA');

INSERT INTO advice(adid,content,mid) VALUES(1,'Miss Blair, we must go or we'll be late',1);

INSERT INTO advice(adid,content,mid) VALUES(2,'I've been invited to a charity event',1);

INSERT INTO advice(adid,content,mid) VALUES(3,'Okay, so whose mess is it?',2);

INSERT INTO advice(adid,content,mid) VALUES(4,'Can i borrow you for a minutes?',2);

INSERT INTO advice(adid,content,mid) VALUES(5,'There is nothing I can do',2);

查詢每個成員的完整信息和所提出的意見的數量

確定所需要的數據表:

member表

advice表:統計建議數量

確定關聯字段:m.mid=a.mid

SELECT m.mid,m.name,COUNT(a.mid)

FROM member m,advice a

WHERE m.mid=a.mid

GROUP BY m.mid,m.name;

增加一個建議,member表中并不存在99的信息,這時候就會出現錯誤數據

INSERT INTO advice(adid,content,mid) VALUES(6,q'[nothing]',99);

現在對于表可以分為父表(member)和子表(advice),因為子表中的數據必須參考member的數據。建議提出的成員編號應該是在member表中mid列上存在的數據.

為了保證表的數據的有效性,只能利用外鍵約束完成.

外鍵使用FOREIGN KEY來進行設置

增加外鍵配置

DROP TABLE member PURGE ;

DROP TABLE advice PURGE ;

CREATE TABLE member(

??? mid???? NUMBER?????? ,

??? name??? VARCHAR2(200)?? NOT NULL ,

?? ?CONSTRAINT pk_mid PRIMARY KEY (mid)

) ;

CREATE TABLE advice(

??? adid???? NUMBER?????? ,

??? content??? CLOB?? NOT NULL ,

??????? mid???? NUMBER,

??? CONSTRAINT pk_adid PRIMARY KEY (adid) ,

?CONSTRAINT fk_adid FOREIGN KEY (mid) REFERENCES member(mid)

) ;

執行錯誤的數據插入:

INSERT INTO advice(adid,content,mid) VALUES(6,q'[nothing]',99);

ORA-02291: 違反完整約束條件 (SCOTT.FK_ADID) - 未找到父項關鍵字

?

一旦為表中增加了外鍵約束,就會有新的問題:

級聯操作問題

問題一:刪除父表數據前需要先清出所有子表的對應數據

DELECT FROM member WHERE mid=1;

RA-02291: 違反完整約束條件 (SCOTT.FK_ADID) - 未找到父項關鍵字

如果要刪除這條記錄,就必須要刪除子表的記錄,但是這樣的做法并不可取.

DELETE FROM advice WHERE mid=1;

DELETE FROM member WHERE mid=1;

解決方法:根據業務需求選擇合適的級聯操作

【級聯操作一】級聯刪除(ON DELETE CASCADE)

當主數據表被刪除后,對應的子表數據也應該同時被清理.這樣不行,比如一個公司部門取消,不能將雇員都刪除.

【級聯操作二】級聯設置NULL(ON DELETE SET NULL)

當主表數據被刪除后,對應的子表數據的相應字段的內容會設置為null.

級聯刪除配置(ON DELETE CASCADE)

DROP TABLE advice PURGE ;

DROP TABLE member PURGE ;

CREATE TABLE member(

??? mid???? NUMBER?????? ,

??? name??? VARCHAR2(200)?? NOT NULL ,

??? CONSTRAINT pk_mid PRIMARY KEY (mid)

) ;

CREATE TABLE advice(

??? adid???? NUMBER?????? ,

??? content??? CLOB?? NOT NULL ,

??????? mid???? NUMBER,

??? CONSTRAINT pk_adid PRIMARY KEY (adid) ,

?CONSTRAINT fk_adid FOREIGN KEY (mid) REFERENCES member(mid) ON DELETE CASCADE

) ;

現在刪除父表記錄,父表記錄以及子表記錄的信息都被刪除.

DELETE FROM member WHERE mid=1;

級聯更新:級聯設置NULL(ON DELETE SET NULL)

DROP TABLE advice PURGE ;

DROP TABLE member PURGE ;

CREATE TABLE member(

??? mid???? NUMBER?????? ,

??? name??? VARCHAR2(200)?? NOT NULL ,

???CONSTRAINT pk_mid PRIMARY KEY (mid)

) ;

CREATE TABLE advice(

??? adid???? NUMBER?????? ,

??? content??? CLOB?? NOT NULL ,

??????? mid???? NUMBER,

??? CONSTRAINT pk_adid PRIMARY KEY (adid) ,

?CONSTRAINT fk_adid FOREIGN KEY (mid) REFERENCES member(mid) ON DELETE SET NULL

) ;

刪除父表中的記錄,這個時候父表中的記錄會被刪除,而子表中的記錄會變為null空.

DELETE FROM member WHERE mid=1;

問題二:刪除父表時需要先將子表刪除

?

查看約束

?

  • 約束依然屬于數據庫對象,可以直接利用數據字典查看。
  • 約束是由數據庫自己創建的兌現個,所有對象都會在數據字典中進行保存
  • 可以利用user_constraints數據字典或者user_cons_columns數據字典查看.

創建一張member表,主鍵不設置名字

CREATE TABLE member(

??? mid???? NUMBER?????? PRIMARY KEY ,

??? name??? VARCHAR2(200)?? NOT NULL ,

) ;

向表中插入數據,

INSERT INTO member(mid,name) VALUES(1,'WENDY');

INSERT INTO member(mid,name) VALUES(1,'GAGA');

當插入第二條數據時候會報錯,ORA-00001: 違反唯一約束條件 (SCOTT.SYS_C0011147)

  • 因為約束在數據庫中也是一個對象,每個對象都有自己的名字,如果用戶沒有指定名字,那么就由系統動態分配一個,所以如上出現的錯誤是SYS_C0011099
  • SYS_C0011099就是數據庫對象(約束)的名稱

user_constraints查看約束信息,就能看到SYS_C0011099

Constraints_type字段可以看到約束的類型,P為主鍵,C為檢查

SELECT * FROM user_constraints;

  • 查看全部的約束名稱、類型、約束設置對應的表名稱

SELECT constraint_name,constraint_type,table_name FROM user_constraints ;

  • 查詢emp表上的全部約束

SELECT constraint_name,constraint_type,table_name

FROM user_constraints WHERE table_name='EMP' ;

要查詢約束所對應的字段,這時候查user_cons_columns

SELECT * FROM user_cons_columns;

?

修改約束(了解)

  • 約束在建立表的時候一定要同時建立;
  • 對于約束不建議對其進行修改。

?

  • 為表中增加約束

      • 語法:ALTER TABLE 表名稱 ADD CONSTRAINT 約束名稱 PRIMARY KEY(約束字段) ;
      • 范例:member表的mid字段增加主鍵約束
        • ALTER TABLE member ADD CONSTRAINT pk_mid PRIMARY KEY(mid) ;
      • 范例:member表的age增加檢查約束
        • ALTER TABLE member ADD CONSTRAINT ck_age CHECK(age BETWEEN 0 AND 200) ;

    啟用/禁用約束

      • 禁用約束
        • ALTER TABLE 表名稱 DISABLE CONSTRAINT 約束名稱 [CASCADE];
        • 范例:禁用advice表中的adid主鍵約束“pk_adid
          • ALTER TABLE advice DISABLE CONSTRAINT pk_adid ;
      • 啟用約束
        • ALTER TABLE 表名稱 ENABLE CONSTRAINT 約束名稱 ;
        • 范例:禁用member表中的“pk_mid”約束,此字段在advice表中是外鍵
          • ALTER TABLE member DISABLE CONSTRAINT pk_mid ;

    刪除約束

      • ALTER TABLE 表名稱 DROP CONSTRAINT 約束名稱 [CASCADE];
      • 范例:刪除advice表之中的“pk_adid”約束 —— 無關聯外鍵
        • ALTER TABLE advice DROP CONSTRAINT pk_adid ;
      • 范例:刪除member表之中的“pk_mid”約束 —— 有關聯外鍵
        • ALTER TABLE member DROP CONSTRAINT pk_mid CASCADE ;

?

?

?

轉載于:https://www.cnblogs.com/thescentedpath/p/constraint.html

總結

以上是生活随笔為你收集整理的数据库完整性约束的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 亚洲一区二区三区在线视频观看 | 久久免| 可以看的黄色网 | 99热这里只 | av资源在线免费观看 | 香蕉久久夜色精品国产使用方法 | 日韩欧美在线观看一区二区 | 一眉道姑 | 综合久久91 | 天堂av亚洲| 精品人妻一区二区三区四区不卡 | 国产91热爆ts人妖在线 | 欧美一区二区福利 | 精品国产AV色欲天媒传媒 | 久久久久久av无码免费网站下载 | 女儿的朋友5中汉字晋通话 欧美成人免费高清视频 | 免费黄色小网站 | 成人在线免费av | 神马久久久久久久久 | 欧美视频精品 | 中文字幕在线日亚洲9 | 无码一区二区三区视频 | 午夜久久久久久久久久影院 | 欧美一区二区三区色 | 亚洲综合久久网 | 国产精品三区在线观看 | 在线视频 日韩 | 亚洲香蕉在线 | 中文字幕免费av | 亚洲天堂免费av | 天天干夜夜拍 | 欧美视频免费在线观看 | 国产夜色精品一区二区av | 人妻熟女一区二区三区 | 黄频在线看| 亚洲综合第一页 | 香蕉福利视频 | 亚洲黄色自拍 | 亚欧在线视频 | 九九热九九热 | 欧美福利视频一区 | 午夜天堂 | 天天看片天天干 | 中文字幕一区二区三区在线观看 | 国产区高清 | 日韩免费影院 | 欧美一区二区三区的 | 久久老熟女一区二区三区 | 一区二区三区在线视频播放 | 极品少妇av| 国内久久精品 | 香蕉91视频 | 日韩精品在线观看一区二区 | 色婷网 | 亚洲免费网站 | 久久久久久久人妻无码中文字幕爆 | 性爱免费视频 | 亚洲欧美激情在线 | 18禁肉肉无遮挡无码网站 | 91无限观看 | 久久久久久久久久久影视 | 九九九久久久 | 日本极品喷水 | 毛片无遮挡 | 免费看黄色网址 | 九色91丨porny丨丝袜 | 激情四射av | 伊人网在线视频观看 | 怡红院综合网 | 久视频在线 | 青娱网电信一区电信二区电信三区 | 欧美精品一二三四 | 亚洲精品一区二区三区蜜桃 | 绯色av一区二区三区高清 | 天天干天天做 | 日韩在线欧美在线 | 亚洲综合99 | 在线观看你懂的视频 | 欧美日色 | 亚洲精品九九 | 奇米久久久 | 已满十八岁免费观看全集动漫 | 欧美日韩免费看 | 午夜网页 | 最新av免费观看 | 久久亚洲精品小早川怜子 | 欧美精品一区二区三 | 丰满人妻一区二区三区四区53 | 欧美另类视频 | 日本裸体xx少妇18在线 | 自拍偷拍激情视频 | 久久婷婷五月综合 | 男女免费网站 | 特级精品毛片免费观看 | 中文成人无字幕乱码精品区 | 又粗又大又硬又长又爽 | 影音先锋国产在线 | av免费网 | 欧美无遮挡 |