实验五 数据库完整性技术
【實驗目的】
1、掌握完整性的概念;
2、熟悉SQL SERVER 的完整性技術。
3、了解SQL SERVER 的違反完整性處理措施。
【實驗性質】
綜合性實驗
【實驗導讀】
1、完整性概述
數據庫完整性指數據的(邏輯而非物理)正確性和相容性。為了防止數據庫中存在不合語義的數據,防止錯誤數據的輸入和輸出。數據庫完整性技術包括完整性約束條件與完整性檢查兩部分。完整性約束條件指為維護數據庫的完整性,DBMS提供加在數據庫數據之上的語義約束條件,作為數據庫模式的一部分存入數據庫。完整性檢查意味檢查數據庫是否滿足完整性約束條件的機制。
完整性約束條件作用的對象可以是關系、元組、列三種。其中列約束主要是列的類型、取值范圍、精度、排序等的約束條件。元組的約束是元組中各個字段間的聯系的約束。關系的約束是若干元組間、關系集合上以及關系之間的聯系的約束。完整性約束條件涉及這三類對象,其狀態可以是靜態的,也可以是動態的。
完整性約束條件一般分為實體完整性、參考完整性 自定義完整性。定義實體完整性約束條件要考慮修改關系中主碼的問題;定義參考完整性約束條件要考慮外碼能否接受空值問題、在被參照關系中刪除元組的問題(級聯刪除或受限刪除)、在參照關系中插入元組時的問題。
RDBMS一般提供定義完整性約束條件:作為表定義的一部分在創建表時創建(采用CREATE TABLE);或者添加到尚沒有完整性約束條件的表中(ALTER TABLE)。
2、MS SQL Server完整性控制技術。
詳細內容參閱 “聯機叢書”中“創建和管理數據庫”->“表” ->“設計表” ->“使用約束、默認值和空值” 、“創建和管理數據庫”->“表” ->“創建和修改表”相關主題以及“聯機從書”的“Transact-SQL參考”相關語句。
在MS SQL Server中將完整性分為:
(1)實體完整性。實體完整性將行定義為特定表的唯一實體。實體完整性強制表的標識符列或主碼的完整性(通過索引、UNIQUE 約束、PRIMARY KEY 約束或 IDENTITY 屬性)。
(2)域完整性。域完整性是指給定列的輸入有效性。強制域有效性的方法有:限制類型(通過數據類型)、格式(通過 CHECK 約束和規則)或可能值的范圍(通過 FOREIGN KEY 約束、CHECK 約束、DEFAULT 定義、NOT NULL 定義和規則)。
(3)引用完整性。在輸入或刪除記錄時,引用完整性保持表之間已定義的關系。在 MS SQL Server中,引用完整性基于外碼與主碼之間或外碼與唯一碼之間的關系(通過 FOREIGN KEY 和 CHECK 約束)。引用完整性確保鍵值在所有表中一致。這樣的一致性要求不能引用不存在的值,如果鍵值更改了,那么在整個數據庫中,對該鍵值的所有引用要進行一致的更改。
強制引用完整性時,MS SQL Server 禁止用戶進行下列操作:
? 當主表中沒有關聯的記錄時,將記錄添加到相關表中。
? 更改主表中的值并導致相關表中的記錄孤立。
? 從主表中刪除記錄,但仍存在與該記錄匹配的相關記錄。
(4)用戶定義完整性。用戶定義完整性使您得以定義不屬于其它任何完整性分類的特定業務規則。所有的完整性類型都支持用戶定義完整性(CREATE TABLE 中的所有列級和表級約束、存儲過程和觸發器)。
設計表時需要識別列的有效值并決定如何強制實現列中數據的完整性。MS SQL Server 提供多種強制列中數據完整性的機制:
? PRIMARY KEY 約束
? FOREIGN KEY 約束
? UNIQUE 約束
? CHECK 約束
? DEFAULT 定義
? 為空性
3、PRIMARY KEY 約束
表中經常有一個列或列的組合,其值能唯一地標識表中的每一行。這樣的一列或多列稱為表的主碼,通過它可強制表的實體完整性。當創建或更改表時可通過定義 PRIMARY KEY 約束來創建主碼。
一個表只能有一個 PRIMARY KEY 約束,而且 PRIMARY KEY 約束中的列不能接受空值。由于 PRIMARY KEY 約束確保唯一數據,所以經常用來定義標識列。
當為表指定 PRIMARY KEY 約束時,MS SQL Server通過為主碼列創建唯一索引強制數據的唯一性。當在查詢中使用主碼時,該索引還可用來對數據進行快速訪問。
如果 PRIMARY KEY 約束定義在不止一列上,則一列中的值可以重復,但 PRIMARY KEY 約束定義中的所有列的組合的值必須唯一。
4、FOREIGN KEY 約束
外碼是用于建立和加強兩個表數據之間的鏈接的一列或多列。通過將保存表中主碼值的一列或多列添加到另一個表中,可創建兩個表之間的鏈接。這個列就成為第二個表的外碼。當創建或更改表時可通過定義 FOREIGN KEY 約束來創建外碼。FOREIGN KEY 約束并不僅僅只可以與另一表的 PRIMARY KEY 約束相鏈接,它還可以定義為引用另一表的 UNIQUE 約束。盡管 FOREIGN KEY 約束的主要目的是控制存儲在外碼表中的數據,但它還可以控制對主碼表中數據的修改。
當用戶試圖刪除或更新外碼所指向的碼時,級聯引用完整性約束可以定義 MS SQL Server 所采取的操作。
5、UNIQUE 約束
可使用 UNIQUE 約束確保在非主碼列中不輸入重復值。盡管 UNIQUE 約束和 PRIMARY KEY約束都強制唯一性,但在強制下面的唯一性時應使用 UNIQUE 約束而不是 PRIMARY KEY 約束:
? 非主碼的一列或列組合。一個表可以定義多個 UNIQUE 約束,而只能定義一個 PRIMARY KEY 約束。
? 允許空值的列。允許空值的列上可以定義 UNIQUE 約束,而不能定義 PRIMARY KEY 約束。
6、CHECK 約束
CHECK 約束通過限制輸入到列中的值來強制域的完整性。這與 FOREIGN KEY 約束控制列中數值相似。區別在于它們如何判斷哪些值有效:FOREIGN KEY 約束從另一個表中獲得有效數值列表,CHECK 約束從邏輯表達式判斷而非基于其它列的數據。
對單獨一列可使用多個 CHECK 約束。按約束創建的順序對其取值。通過在表一級上創建 CHECK 約束,可以將該約束應用到多列上。
7、DEFAULT 約束
元組中的每一列均必須有值,即使它是 NULL。可能會有這種情況,當向表中裝載新行時可能不知道某一列的值,或該值尚不存在。如果該列允許空值,就可以將該行賦予空值。由于有時不希望有可為空的列,因此如果合適,更好的解決辦法可能是為該列定義 DEFAULT 定義。
當將某行裝載到為行定義了 DEFAULT 的表中時,若沒有指定列值,則是隱性要求 MS SQL Server將默認值裝載到該列中
8、允許空值
列為空性決定該列在表中是否允許空值。空值或 NULL 并不等于零 (0)、空白或零長度的字符串(如“”),NULL 意味著沒有輸入。NULL 的存在通常表明值未知或未定義。例如,pubs 數據庫 titles 表中 price 列的空值并不表示該書沒有價格,而是指其價格未知或尚未設定。總之,由于空值在查詢和更新時會使事情變得更復雜,而且有其它列選項,如 PRIMARY KEY 約束等不能使用允許空值的列,所以應避免允許空值。
如果插入某行但沒有為允許空值的列包括值,則 MS SQL Server提供 NULL 值(除非存在 DEFAULT 定義或 DEFAULT 對象)。
指定一列不允許空值而確保行中一列永遠包含數據可以保持數據的完整性。如果不允許空值,用戶在向表中寫數據時必須在列中輸入一個值,否則該行不被接收入數據庫。
【實驗內容】
use qixin
drop table 職工
drop table 部門
create table 部門
(
?部門號???? char(4),
?名稱???? varchar(20) not null,
?經理名???? varchar(8),
?地址???? varchar(50),
?電話號???? varchar(20),
?constraint PK_部門號 primary key(部門號),
?constraint U_名稱 unique(名稱)
)
create table 職工
(
?職工號???? char(4) ,
?姓名???? varchar(8) not null ,
?年齡???? int ,
?職務???? varchar(10) ,
?工資???? money,
?部門號???? char(4),
?constraint PK_職工號 primary key(職工號),
?constraint FK_部門號 foreign key(部門號) references 部門(部門號) on delete cascade,
?constraint CK_年齡 check(年齡<=60)
)
insert into 部門 values('0001','財務科','張三','湖北汽車工業學院','8238787')
/*(1)*/
--如果再次insert into 部門 values('0001','財務科','張三','湖北汽車工業學院','8238787'),
--則會違反了 PRIMARY KEY 約束 'PK__部門__571DF1D5'。不能在對象 '部門' 中插入重復鍵。
/*(2)*/
--如果執行insert into 部門 values('0002','財務科','張三','湖北汽車工業學院','8238787')
--則會違反了 UNIQUE KEY 約束 'UQ__部門__5812160E'。不能在對象 '部門' 中插入重復鍵。
insert into 部門 values('0002','教務科','李四','湖北汽車工業學院','8238787')
insert into 部門 values('0003','人事科','王二','湖北汽車工業學院','8238787')
insert into 職工 values('0001','張偉','30','科長',2000,'0001')
insert into 職工 values('0002','李紅','25','副科長',1500,'0001')
insert into 職工 values('0003','王強','33','科長',2000,'0002')
insert into 職工 values('0004','趙東','34','副科長',1500,'0002')
insert into 職工 values('0005','陳三','29','科長',2000,'0003')
insert into 職工 values('0006','孫波','28','副科長',1500,'0003')
--如果執行insert into 職工 values('0007','陳紅','70','副科長',1500,'0003')
--則會INSERT 語句與 COLUMN CHECK 約束 'CK__職工__年齡__656C112C' 沖突。
--該沖突發生于數據庫 'qixin',表 '職工', column '年齡'。
select * from 部門
select * from 職工
--當指定on delete cascade時為級聯刪除,刪除部門表記錄時,職工表中相關的記錄也會同時刪除
delete from 部門 where 部門號='0001'
delete from 部門 where 部門號='0002'
delete from 部門 where 部門號='0003'
--如果不指定on delete cascade時默認為受限刪除,刪除部門表記錄時
--則會DELETE 語句與 COLUMN REFERENCE 約束 'FK__職工__部門號__6D0D32F4' 沖突。
--該沖突發生于數據庫 'qixin',表 '職工', column '部門號'。
總結
以上是生活随笔為你收集整理的实验五 数据库完整性技术的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HTML技巧100例(三)
- 下一篇: linux cmake编译源码,linu