數據完整性

目錄

創建約束

1.主鍵約束

2.外鍵約束

3.唯一約束

4.檢查約束

5.默認約束

創建默認值

1.創建默認值

2.綁定默認值

3.解除默認值

4.刪除默認值

創建規則

綁定規則

鬆綁規則

刪除規則

創建標識列


 數據完整性知識目標

● 瞭解數據完整性及其分類;

● 掌握約束的作用和各種約束的使用方法;

● 掌握默認值和規則的作用和使用方法;

● 理解標識列的作用和使用方法。

技能目標

● 會在數據表上創建和刪除主鍵約束、外鍵約束、唯一約束、檢查約束、默認約束;

● 會在數據表上創建默認值、規則;

● 會在數據表上創建標識列。知識學習數據的完整性是保證數據的正確性、一致性和相容性。爲了保證數據庫的完整性,數據庫管理系統必須提供一種機制來檢查數據庫中的數據是否滿足語義的要求,這種功能稱爲完整性檢查。這些加在數據庫數據上的語義約束條件稱爲數據庫完整性約束條件。數據完整性分爲四類:實體完整性、域完整性、參照完整性、用戶定義的完整性。

 

1.實體完整性

實體完整性規定表的每一行在表中是唯一的實體。表中定義的PRIMARYKEY約束就是實體完整性的體現。

2.域完整性

域完整性是指數據庫表中的屬性列必須滿足某種特定的數據類型或約束。其中約束又包括取值範圍、精度等規定。表中的UNIQUE、CHECK、FOREIGN KEY約束和DEFAULT、NOT NULL定義都屬於域完整性的範疇。

3.參照完整性

參照完整性是指兩個表的主鍵和外鍵值的數據應對應一致。它確保了有主鍵的表中對應其他表的外鍵的數據行存在,即保證了表之間數據的一致性,防止了數據丟失或無意義的數據在數據庫中擴散。參照完整性是建立在外鍵和主鍵之間的橋樑。在SQL Server2012中,參照完整性作用表現在如下幾個方面:

①禁止在從表中插入包含主表中不存在的關鍵字的數據行。

②禁止會導致從表中的相應值孤立的主表中的外鍵值改變。

③禁止刪除在從表中有對應記錄的主表記錄。

4.用戶定義的完整性

不同的關係數據庫系統根據其應用環境的不同,往往還需要一些特殊的約束條件。用戶定義的完整性針對某個特定關係數據庫的約束條件,反映某一具體應用所涉及的數據必須滿足的語義要求。SQL Server 2012提供了定義和檢驗這類完整性的機制,以便用統一的系統方法來處理它們,而不是用應用程序來承擔這一功能。其他的完整

創建約束

約束定義關於屬性中允許值的規則,是一種強制性的規定,在SQL Server2012中提供的約束是通過定義列的取值規則來維護數據完整性的。約束可以在創建表的同時創建,也可以在已有的表上創建。

約束有5種類型:主鍵約束(PRIMARY KEY)、外鍵約束(FOREIGNKEY)、唯一約束(UNIQUE)、檢查約束(CHECK)和默認(DEFAULT)約束。

在SQL Server 2012中,可以使用對象資源管理器、CREATE TABLE語句或ALTER TABLE語句創建約束。使用CREATE TABLE語句可以在創建表的同時一起創建約束,Transact-SQL語法格式如下:

創建表之後,使用ALTER TABLE語句創建約束的語法格式如下:

當約束不符合實際需求的時候,可以刪除約束。可以使用對象資源管理或者ALTER TABLE語句刪除約束。使用ALTER TABLE語句刪除約束的Transact-SQL語法格式如下:

1.主鍵約束

主鍵約束的關鍵詞爲PRIMARY KEY, PRIMARY KEY約束用於定義基本表的主鍵,具有唯一標識作用,其值不能爲NULL,也不能重複,以此來保證實體的完整性。

(1)創建主鍵約束

①使用對象資源管理器創建主鍵約束。

爲Student數據庫中的Student表創建主鍵約束。Student表的StuNo爲主鍵,所以將StuNo定義爲主鍵約束,確保在Student表中不會出現相同的學號和學號是空值的數據行,以此保證每個學生都是可以識別的。

  • 將光標定位於StuNo行。
  • 單擊工具欄中的“設置主鍵”按鈕[插圖],或右擊StuNo行,在彈出的快捷菜單中選擇“設置主鍵”命令,主鍵約束創建完成.
  • 單擊工具欄中的“保存”按鈕[插圖],完成創建。

②使用Transact-SQL語句創建主鍵約束。使用Transact-SQL語句創建主鍵約束可以用CREATE TABLE命令在創建表的同時完成,也可以利用ALTERTABLE命令爲已經存在的表創建主鍵約束。

CREATE TABLE Department1
(
	DepartNo nvarchar(2) CONSTRAINT PK_Department PRIMARY KEY,
	DepartName nvarchar(2) NOT NULL
) 

等價形式如下:

CREATE TABLE Department2
(
	DepartNo nvarchar(2)  PRIMARY KEY,
	DepartName nvarchar(2) NOT NULL
) 

 

使用ALTER TABLE語句爲已存在的Course表和Class表添加主鍵約束。

ALTER TABLE Course
ADD CONSTRAINT PK_Course
PRIMARY KEY (CouNo)

ALTER TABLE Course
ADD CONSTRAINT PK_Course
PRIMARY KEY (CouNo)

(2)刪除主鍵約束

①使用對象資源管理器刪除主鍵約束。

ALTER TABLE Course
DROP CONSTRAINT PK_Course

2.外鍵約束

外鍵約束即FOREIGN KEY約束,外鍵約束指定某一個列或幾列作爲外鍵,以此來保證系統在外鍵上的取值是主表中的某一個主鍵值,或者取空值,進而保證兩表間的參照完整性。外鍵是維護表與表之間對應唯一關係的一種方法。

(1)創建外鍵約束①使用對象資源管理器創建外鍵約束。

爲Student數據庫的StuCou表創建基於StuNo的外鍵約束,該約束名爲“FK_StuCou_Student”,限制StuCou表的StuNo列的值必須是Student表的StuNo列已經存在的值,以此來保證實實在在存在的學生才能選課,不存在的學生無法選課,保證數據的參照完整性。

 

①使用對象資源管理器創建外鍵約束。

②使用Transact-SQL語句創建外鍵約束。使用Transact-SQL語句創建外鍵約束可以用CREATE TABLE命令在創建表的同時完成,也可以利用ALTERTABLE命令爲已經存在的表創建外鍵約束。

爲已經存在的表創建外鍵約束的語法格式如下:

參數說明如下:table_name:要添加外鍵約束且已經存在的表名。

constraint_name:要添加外鍵約束名。

columnname:外鍵列名。

ref_tablename:主鍵表名。

ref_columnname:主鍵表列名。

使用ALTER TABLE語句在Student表中爲ClassNo創建外鍵約束,設置其名稱爲FK_Student_Class。

ALTER TABLE Student
ADD
CONSTRAINT FK_Student_Class
FOREIGN KEY (ClassNo)
REFERENCES Class (ClassNo)

 

(2)刪除外鍵約束①使用對象資源管理器刪除外鍵約束。

②使用Transact-SQL語句刪除外鍵約束。

使用ALTER TABLE語句刪除Student表中名稱爲FK_Student_Class的外鍵約束。

ALTER TABLE Student
DROP
CONSTRAINT FK_Student_Class

3.唯一約束

UNIQUE約束(唯一約束)指明基本表在某一列或多個列的組合上的取值必須唯一。但是使用UNIQUE約束的字段允許爲NULL值。(1)創建唯一約束①使用對象資源管理器創建唯一約束。

(1)創建唯一約束①使用對象資源管理器創建唯一約束。

爲Student數據庫的Student表中的StuName列創建唯一約束,以此保證學生表中的學生姓名沒有重複值。

②使用Transact-SQL語句創建唯一約束。使用Transact-SQL語句創建唯一約束可以用CREATE TABLE命令在創建表的同時完成,也可以利用ALTERTABLE命令爲已經存在的表創建唯一約束。

爲已經存在的表創建唯一約束的語法格式如下:

參數說明如下:

table1_name:要添加唯一約束且已經存在的表名。

constraint_name1:要添加唯一約束名。

colname1:唯一約束的列名。

使用ALTER TABLE語句在Department表的DepartName列上創建唯一約束,設置其名稱爲UN_DepartName。

在查詢窗口中執行如下Transact-SQL語句:

ALTER TABLE Department
ADD
CONSTRAINT UN_DepartName
UNIQUE (DepartName)

注意:無論採用哪種方法創建唯一約束,前提是一定要確保唯一約束屬性列的值不存在重複值,否則創建會失敗。

(2)刪除唯一約束①使用對象資源管理器刪除唯一約束。

①使用對象資源管理器刪除唯一約束。

②使用Transact-SQL語句刪除唯一約束。

使用ALTER TABLE語句刪除Department表中名稱爲UN_DepartName的唯一約束。

在查詢窗口中執行如下Transact-SQL語句:

ALTER TABLE Department
DROP
CONSTRAINT UN_DepartName

4.檢查約束

檢查約束即CHECK約束,對可以放入列中的值進行限制,用來檢查字段值所允許的範圍,以此保證域的完整性。

(1)創建檢查約束。

①使用對象資源管理器創建檢查約束。

②使用Transact-SQL語句創建檢查約束。可以利用ALTER TABLE命令爲已經存在的表創建檢查約束。

在查詢窗口中執行如下Transact-SQL語句:

ALTER TABLE StuCou
ADD
CONSTRAINT CK_Score1 CHECK(Score >=0 AND Score <=100)

(2)刪除檢查約束

①使用對象資源管理器刪除檢查約束。

②使用Transact-SQL語句刪除檢查約束。可以利用ALTER TABLE命令爲已經存在的表創建檢查約束。

在查詢窗口中執行如下Transact-SQL語句:

5.默認約束

在用戶輸入某些數據時,希望一些數據在沒有特例的情況下被自動輸入,例如學生的性別默認爲“女”等情況,這個時候需要對數據創建默認約束。默認約束就是避免屬性列值出現空值的一種辦法,以此減少在客戶端開發工具(如C#)中對SQL Server中空值進行特殊額外的處理。

(1)創建默認約束

①使用對象資源管理器創建默認約束。

使用對象資源管理器爲Course表的Kind列創建默認約束,使Kind列的值默認爲“理工”,即在不輸入值的情況下的值爲“理工”。

②使用Transact-SQL語句創建默認約束。使用Transact-SQL語句創建默認約束可以用CREATE TABLE命令在創建表的同時完成,也可以利用ALTERTABLE命令爲已經存在的表創建默認約束。

語法格式如下:

參數說明如下:

table_name:基本表表名。

constraint_name:約束名。

constraint _expression:約束表達式。

column_name:默認約束的約束屬性列列名。

使用Transact-SQL語句中的ALTER TABLE語句爲StuCou表添加默認約束,使StuCou表中的State在未輸入值時的默認值爲“選課”。

ALTER TABLE StuCou
ADD
CONSTRAINT DF_State
DEFAULT ('選課') FOR State

(2)刪除默認約束

①使用對象資源管理器刪除默認約束。

 

②使用Transact-SQL語句刪除默認約束。

在查詢窗口中執行如下Transact-SQL語句:

ALTER TABLE StuCou
DROP
CONSTRAINT DF_State

創建默認值

默認是一種獨立的數據對象,它與DEFAULT(默認)約束的作用相同,也是當向表中輸入數據時,沒有爲列輸入值的情況下,系統自動給該列賦予一個“默認值”。此處的默認對象與用CREATE TABLE或ALTER TABLE語句操作表時使用DEFAULT(默認)約束的功能相似,不同的是默認對象的定義獨立於表,是一種數據庫對象。在數據庫中一次創建後,可以多次應用任意表的任意列,也可以應用於用戶定義數據類型。默認值可以是常量、內置函數或數學表達式。

1.創建默認值

CREATE DEFAULT語句用於在數據庫中創建默認對象,其語法格式如下:

CREATE DEFAULT 默認名 AS default_expression

其中,default_expression:指默認的定義,可以是數學表達式或函數,也可以是常量。

設置Student表的Pwd列的默認值爲“00000000”,創建的默認值的名稱爲PwdDefault。

注意:執行完上述語句後,僅僅在Student數據庫中創建了一個名爲PwdDefault的默認對象,並未產生任何作用。

2.綁定默認值

創建默認值後,必須將其綁定到表的字段或用戶自定義的數據類型上才能產生作用。綁定默認值可以使用sp_bindefault存儲過程,也可以使用SQLServer對象資源管理器。

將名稱爲PwdDefault的默認值綁定到Student表的Pwd列上。

在查詢窗口中,執行如下Transact-SQL語句:

注意:執行完上述語句後,將顯示消息“已將默認值綁定到列”,如圖3-38所示。“PwdDefault”默認值將作用於Student表的Pwd屬性列上。

當在輸入過程中,未指定Pwd列的值,系統將自動填充“00000000”值。打開Student表,進入編輯狀態,添加一條記錄,學號爲“20150005”,姓名爲“王勃”,班號爲“20150101”,不輸入Pwd列的值,系統自動填充“00000000”值,如圖3-39所示。爲了保證數據庫中數據的一致性,將剛纔插入的記錄再進行刪除。

3.解除默認值

解除默認值PwdDefault與Student表的Pwd列的綁定。

在查詢窗口中執行如下Transact-SQL語句:

EXEC sp_unbindefault 'Student.Pwd'

 

注意:執行完後,解除了默認值PwdDefault與Student表的Pwd列的綁定。當在輸入過程中,未指定Pwd列的值,將爲空值。

4.刪除默認值

當默認值不再符合實際需求時,可以將其刪除。在刪除前,必須將默認值解除。在查詢分析器中使用DROP語句刪除默認值。

在查詢窗口中執行如下Transact-SQL語句:

DROP DEFAULT PwdDefault

注意:執行完後,名爲PwdDefault的默認數據對象將在Student數據庫中消失。

創建規則

規則(Rule)就是數據庫對存儲在表中的列或用戶自定義數據類型中的值的規定和限制。規則與其作用的表或用戶自定義數據類型是相互獨立的,即表或用戶自定義對象的刪除、修改不會對與之相連的規則產生影響。規則與CHECK約束相似,不同之處在於在一個屬性列上只能有一個規則,但可以有多個CHECK約束。相比之下,在ALTER TABLE或CREATE TABLE命令中使用的CHECK約束更加標準,但CHECK約束不能作用於用戶自定義的數據類型,而規則不僅可以應用在多個列上還可以作用於用戶自定義的數據類型。

創建規則

CREATE命令用於在數據庫中創建默認對象,其語法格式如下:

CREATE RULE 規則名 AS condition_expression

其中,condition_expression:指規則的定義,任何數學表達式可包含算數運算符、關係運算符和謂詞(如BETWEEN…AND、IN等)。

創建規則,使課程表Course的Credit值大於或等於1,小於或等於10。

在查詢窗口中執行如下Transact-SQL語句:

CREATE RULE  Credit_rule
AS @Credit>=1 and @Credit <=10

綁定規則

創建規則後,規則僅僅是一個存在於數據庫中的對象,並未發生作用。需要將規則與數據庫表或用戶自定義對象聯繫起來,才能達到創建規則的目的。所謂綁定就是指定規則作用於哪個表的哪一列或哪個用戶自定義數據類型。

綁定規則Credit_rule到Course表的Credit字段。

在查詢窗口中執行如下Transact-SQL語句:

EXEC sp_bindrule 'Credit_rule','Course.Credit'

鬆綁規則

解除規則與對象的綁定稱爲“鬆綁”。解除已綁定到Course表的Credit字段的規則Credit_rule。

在查詢窗口中執行如下Transact-SQL語句:

EXEC sp_unbindrule 'Course.Credit'

 

刪除規則

使用DROP RULE命令刪除規則,語法結構如下:DROP RULE {rule_name} [,...n]

刪除Credit_rule規則。

在查詢窗口中執行如下Transact-SQL語句:

DROP RULE Credit_rule

注意:在刪除一個規則前必須先將與其綁定的對象解除綁定。

創建標識列

在實際設計中,有時候希望計算機能自動生成標識列。如果初值(稱爲種子)爲1,增量爲1,則第一行數據的標識列值自動生成1。對於第二行數據標識列的值,系統自動生成爲前一行的標識列值加上增量,即爲2,不需要人工輸入標識列的值。

標識列與主鍵約束、唯一約束一樣,能唯一標識表中的每一行,可以用來保證表的完整性。

每個表只能定義一個標識列,語法格式如下:

列名數據類型IDENTITY(種子,增量)

注意:

①數據類型必須爲數值型。可爲下列數據類型之一:int、smallint。

②系統默認種子和增量的初值均爲1。

③標識列不允許出現空值,也不能有默認約束和檢查約束。

④對經常進行刪除操作的表最好不要使用標識列,因爲刪除操作會使標識列的值出現不連續的情況。

在Student數據庫中創建一個ClassRoom表,表中有兩個屬性列:ClassRoomID爲標識列,初值爲1,增量爲1;ClassRoomName列爲字符型,長度爲30,不允許爲空。

在查詢窗口中執行如下Transact-SQL語句:

USE Student
GO
CREATE TABLE ClassRoom
(
	ClassRoomID int IDENTITY(1,1),
	ClassRomeName char(30) NOT NULL
)
GO

INSERT ClassRoom(ClassRomeName) VALUES('多媒體1教室')
INSERT ClassRoom(ClassRomeName) VALUES('多媒體2教室')
INSERT ClassRoom(ClassRomeName) VALUES('計算機1教室')
GO
SELECT * 
FROM ClassRoom
GO

執行結果如圖所示,顯示出3個數據行,其中ClassRoomID的值依次爲1、2、3。

 

發佈了140 篇原創文章 · 獲贊 38 · 訪問量 18萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章