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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

f分布表完整图a=0.01_SQL数据库完整性

發(fā)布時間:2023/12/31 数据库 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 f分布表完整图a=0.01_SQL数据库完整性 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

數(shù)據(jù)庫完整性

  • 數(shù)據(jù)的準(zhǔn)確性:for:學(xué)生的學(xué)號必須唯一
  • 數(shù)據(jù)的相容性:是指數(shù)據(jù)庫同一對象在不同關(guān)系表中的數(shù)據(jù)是符合邏輯的
    • for: 生所選的課程必須是學(xué)校開設(shè)的課程
  • 數(shù)據(jù)的完整性和安全性是兩個不同概念
    • 完整性是防止合法用戶誤操作
    • 安全性是防止非法用戶非法數(shù)據(jù)
  • 如何保護(hù)數(shù)據(jù)庫的完整性:
    • 提供定義完整性約束條件(完整性規(guī)則)的機制
      • DDL 語句來定義,由DBMS 將其存入數(shù)據(jù)字典
    • 提供完整性檢查機制:一般在數(shù)據(jù)操縱之后
    • 違約處理
      • 拒絕(NO ACTION)執(zhí)行該操作
      • 級連(CASCADE)執(zhí)行其他操作
  • 由DBMS進(jìn)行完整性檢查

實體完整性

CREATE TABLE中用PRIMARY KEY定義(主碼定義)

  • 插入或?qū)χ鞔a列進(jìn)行更新操作時,DBMS按照實體完整性規(guī)則自動進(jìn)行檢查。
    • 檢查主碼值是否唯一
    • 檢查主碼的各個屬性是否為空
    • 為避免對基本表進(jìn)行全表掃描,RDBMS核心一 般都在主碼上自動建立一個索引
      • 例子:B+樹
  • 單屬性構(gòu)成的碼
    • 定義為列級約束條件
    • 定義為表級約束條件
  • 多個屬性構(gòu)成的碼
    • 定義為表級約束條件

[例5.1] 將Student表中的Sno屬性定義為碼

(1)在列級定義主碼

CREATE TABLE Student(Sno CHAR(9) PRIMARY KEY,Sname CHAR(20) NOT NULL,Ssex CHAR(2),Sage SMALLINT,Sdept CHAR(20) );

(2)在表級定義主碼

CREATE TABLE Student(Sno CHAR(9),Sname CHAR(20) NOT NULL,Ssex CHAR(2),Sage SMALLINT,Sdept CHAR(20),PRIMARY KEY (Sno) );

[例5.2] 將SC表中的Sno,Cno屬性組定義為碼

CREATE TABLE SC(Sno CHAR(9) NOT NULL,Cno CHAR(4) NOT NULL,Grade SMALLINT,PRIMARY KEY (Sno,Cno)/*只能在表級定義主碼*/ );

參照完整性

若屬性(或?qū)傩越M)F是基本關(guān)系R的外碼它與基本關(guān)系S的 主碼

相對應(yīng)(基本關(guān)系R和S不一定是不同的關(guān)系),則 對于R中每個元組在F上的值必須為:
  • 或者取空值(F的每個屬性值均為空值)
  • 或者等于S中某個元組的主碼值

例:學(xué)生關(guān)系的“專業(yè)號”是外碼,它參照專業(yè)關(guān)系的主碼“專業(yè)號”

學(xué)生關(guān)系中每個元組的“專業(yè)號”屬性只取兩類值:
(1)空值,表示該學(xué)生尚未確定專業(yè)
(2)非空值, 這時該值必須是專業(yè)關(guān)系中某個元組的“專業(yè)號”值,表 示該學(xué)生不可能屬于一個不存在的專業(yè)

SQL定義:

  • 在CREATE TABLE中用FOREIGN KEY?短語定義哪些列為外碼
  • 用REFERENCES短語指明這些外碼參照哪些表的主碼

例5.3:Student表的Sdept屬性是外碼,參照DEPT表的主碼Deptno

CREATE TABLE Student ( Sno CHAR(9) PRIMARY KEY,/* 列級完整性約束條件,Sno是主碼*/Sname CHAR(20) UNIQUE,Ssex CHAR(2),Sage SMALINT,Sdept CHAR(20) FOREIGN KEY REFERENCES DEPT(Deptno)/*在列級定義參照完整性*/ );

例:Student表的Sdept屬性是外碼,參照DEPT表的主碼Deptno

CREATE TABLE Student ( Sno CHAR(9) PRIMARY KEY,/* 列級完整性約束條件,Sno是主碼*/Sname CHAR(20) UNIQUE,Ssex CHAR(2),Sage SMALLINT,Sdept CHAR(20),FOREIGN KEY(Sdept) REFERENCES DEPT(Deptno)/*在表級定義參照完整性*/ );

例:關(guān)系SC中(Sno,Cno)是主碼。Sno,Cno分別參照Student表的主 碼和Course表的主碼

CREATE TABLE SC ( Sno CHAR(9) NOT NULL,Cno CHAR(4) NOT NULL,Grade SMALLINT,PRIMARY KEY (Sno, Cno),/*在表級定義實體完整性*/FOREIGN KEY (Sno) REFERENCES Student(Sno),/*在表級定義參照完整性*/FOREIGN KEY (Cno) REFERENCES Course(Cno)/*在表級定義參照完整性*/ );

破壞參照完整性的四種情況

  • SC表中增加一個元組,該元組的Sno屬性的值在表Student 中找不到一個元組,其Sno屬性的值與之相等

  • 修改SC表中的一個元組,修改后該元組的Sno屬性的值在 表Student中找不到一個元組,其Sno屬性的值與之相等

  • 從Student表中刪除一個元組,造成SC表中某些元組的 Sno屬性的值在表Student中找不到一個元組,

  • 修改Student表中一個元組的Sno屬性,造成SC表中某些 元組的Sno屬性的值在Student中找不到一個元組

違約處理:

  • 拒絕(NO ACTION)執(zhí)行
  • 級聯(lián)(CASCADE)操作:

  • 設(shè)置為空值(SET-NULL):

[例5.4] 顯式說明參照完整性的違約處理示例

CREATE TABLE SC ( Sno CHAR(9) NOT NULL,Cno CHAR(4) NOT NULL,Grade SMALLINT,PRIMARY KEY(Sno,Cno),FOREIGN KEY (Sno) REFERENCES Student(Sno)ON DELETE CASCADE/*級聯(lián)刪除SC表中相應(yīng)的元組*/ON UPDATE CASCADE,/*級聯(lián)更新SC表中相應(yīng)的元組*/FOREIGN KEY (Cno) REFERENCES Course(Cno)ON DELETE NO ACTION/*當(dāng)刪除course 表中的元組造成了與SC表不一致時拒絕刪除*/ON UPDATE CASCADE/*當(dāng)更新course表中的cno時,級聯(lián)更新SC表中相應(yīng)的元組*/ );

用戶定義的完整性

針對某一具體應(yīng)用的數(shù)據(jù)必須滿足 的語義要求

  • 列值非空(NOT NULL)
  • 列值唯一(UNIQUE)
  • 檢查列值是否滿足一個條件表達(dá)式(CHECK)

[例5.5] 在定義SC表時,說明Sno、Cno、Grade屬性不允 許取空值。

CREATE TABLE SC ( Sno CHAR(9) NOT NULL,//Cno CHAR(4) NOT NULL,//可以不寫,primary key 已經(jīng)約束了Grade SMALLINT NOT NULL,PRIMARY KEY (Sno, Cno), );

[例5.6]建立專業(yè)表DEPT,要求專業(yè)名稱Dname列取值唯一且不能取 空值,專業(yè)編號Deptno列為主碼。

CREATE TABLE DEPT ( Deptno NUMERIC(2),Dname CHAR(9) UNIQUE NOT NULL,/*要求Dname列值唯一, 并且不能取空值*/PRIMARY KEY (Deptno) );

[例5.7] Student表的Ssex只允許取“男”或“女”。

CREATE TABLE Student ( Sno CHAR(9) PRIMARY KEY,Sname CHAR(8) NOT NULL,Ssex CHAR(2) CHECK (Ssex IN (‘男’,’女’)),/*性別屬性Ssex只允許取'男'或'女' */Sage SMALLINT,Sdept CHAR(20) );

[例5.8] SC表的Grade的值應(yīng)該在0和100之間。

CREATE TABLE SC ( Sno CHAR(9) ,Cno CHAR(4),Grade SMALLINT CHECK (Grade>=0 AND Grade <=100),/*Grade取值范圍是0到100*/PRIMARY KEY (Sno,Cno),FOREIGN KEY (Sno) REFERENCES Student(Sno),FOREIGN KEY (Cno) REFERENCES Course(Cno) );

[例5.9]當(dāng)學(xué)生的性別是男時,其名字不能以Ms.打頭。

CREATE TABLE Student ( Sno CHAR(9),Sname CHAR(8) NOT NULL,Ssex CHAR(2),Sage SMALLINT,Sdept CHAR(20),PRIMARY KEY (Sno),CHECK (Ssex='女' OR Sname NOT LIKE 'Ms.%')/*定義了元組中Sname和 Ssex兩個屬性值之間的約束條件*/ );

完整性約束命名子句

不命名的話就無法對完整性約束就行修改和刪除

CONSTRAINT <完整性約束條件名><完整性約束條件>

  • <完整性約束條件>包括NOT NULL、UNIQUE、 PRIMARY KEY短語、FOREIGN KEY短語、CHECK 短語等

[例5.10]建立學(xué)生登記表Student,要求學(xué)號在90000~99999之間,姓名不能取空值,年齡小于30,性別只能是“男”或“女”。

CREATE TABLE Student ( Sno NUMERIC(6)CONSTRAINT C1 CHECK (Sno BETWEEN 90000 AND 99999),Sname CHAR(20) CONSTRAINT C2 NOT NULL,Sage NUMERIC(3) CONSTRAINT C3 CHECK (Sage < 30),Ssex CHAR(2) CONSTRAINT C4 CHECK (Ssex IN ( ‘男’,'女')),CONSTRAINT StudentKey PRIMARY KEY(Sno) );//c1,c2,cc3,c4是完整性約束條件名

[例5.11]建立教師表TEACHER,要求每個教師的應(yīng)發(fā)工資不低于3000 元。應(yīng)發(fā)工資是工資列Sal與扣除項Deduct之和。

CREATE TABLE TEACHER ( Eno NUMERIC(4) PRIMARY KEY,/*在列級定義主碼*/Ename CHAR(10),Job CHAR(8),Sal NUMERIC(7,2),Deduct NUMERIC(7,2),Deptno NUMERIC(2),CONSTRAINT TEACHERFKey FOREIGN KEY (Deptno) REFERENCES DEPT(Deptno),CONSTRAINT C1 CHECK (Sal + Deduct >= 3000) );
  • 使用ALTER TABLE語句修改表中的完整性限制

[例5.12]去掉例5.10 Student表中對性別的限制。

ALTER TABLE Student DROP CONSTRAINT C4;

[例5.13] 修改表Student中的約束條件,要求學(xué)號改為在 900000~999999之間,年齡由小于30改為小于40

ALTER TABLE Student DROP CONSTRAINT C1;ALTER TABLE Student ADD CONSTRAINT C1 CHECK (Sno BETWEEN 900000AND 999999),ALTER TABLE Student DROP CONSTRAINT C3;ALTER TABLE Student ADD CONSTRAINT C3 CHECK(Sage < 40);

斷言

使用 CREATE ASSERTION語句,通過聲 明性斷言來指定更具一般性的約束。

CREATE ASSERTION<斷言名><CHECK 子句>

創(chuàng)建斷言

[例5.18] 限制數(shù)據(jù)庫課程最多60名學(xué)生選修

CREATE ASSERTION ASSE_SC_DB_NUM CHECK (60 >= (select count(*)From Course,SCWhere SC.Cno=Course.Cno andCourse.Cname ='數(shù)據(jù)庫') );

[例5.19]限制每一門課程最多60名學(xué)生選修

CREATE ASSERTION ASSE_SC_CNUM1 CHECK (60 >= ALL (SELECT count(*)FROM SCGROUP by cno) );

[例5.20]限制每個學(xué)期每一門課程最多60名學(xué)生選修

//首先需要修改SC表的模式,增加一個“學(xué)期(TERM)”屬性 ALTER TABLE SC ADD TERM DATE; //定義斷言: CREATE ASSERTION ASSE_SC_CNUM2 CHECK (60 >= ALL (SELECT count(*) FROM SCGROUP by cno,TERM) );

刪除斷言

DROP ASSERTION <斷言名>;


觸發(fā)器

得到再補上吧

Trigger,是用戶定義在關(guān)系表上的一類由事件驅(qū)動的特殊過程

  • 行級觸發(fā)器(FOR EACH ROW)
  • 語句級觸發(fā)器(FOR EACH STATEMENT)

定義觸發(fā)器

CREATE TRIGGER <觸發(fā)器名> {BEFORE | AFTER} <觸發(fā)事件> ON <表名> REFERENCING NEW|OLD ROW AS <變量> FOR EACH {ROW | STATEMENT} [WHEN <觸發(fā)條件>]<觸發(fā)動作體>

[例5.21]當(dāng)對表SC的Grade屬性進(jìn)行修改時,若分?jǐn)?shù)增加了10%則將此 次操作記錄到下面表中:

SC_U(Sno,Cno,Oldgrade,Newgrade)

CREATE TRIGGER SC_T AFTER UPDATE OF Grade ON SC REFERENCINGOLD row AS OldTuple,NEW row AS NewTuple FOR EACH ROW WHEN (NewTuple.Grade >= 1.1*OldTuple.Grade) INSERT INTO SC_U(Sno,Cno,OldGrade,NewGrade) VALUES(OldTuple.Sno,OldTuple.Cno,OldTuple.Grade,NewTuple.Grade)

[例5.22] 將每次對表Student的插入操作所增加的學(xué)生個數(shù) 記錄到表StudentInsertLog中。

CREATE TRIGGER Student_Count AFTER INSERT ON Student REFERENCINGNEW TABLE AS DELTA FOR EACH STATEMENTINSERT INTO StudentInsertLog (Numbers)SELECT COUNT(*) FROM DELTA

[例5.23] 定義一個BEFORE行級觸發(fā)器,為教師表Teacher 定義完整性規(guī)則“教授的工資不得低于4000元,如果低 于4000元,自動改為4000元”

CREATE TRIGGER Insert_Or_Update_Sal BEFORE INSERT OR UPDATE ON Teacher FOR EACH ROWBEGINIF (new.Job='教授') AND (new.Sal < 4000)THEN new.Sal :=4000;END IF;END;

###刪除觸發(fā)器

DROP TRIGGER <觸發(fā)器名> ON <表名

總結(jié)

以上是生活随笔為你收集整理的f分布表完整图a=0.01_SQL数据库完整性的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。