1. 程式人生 > >資料庫學習之旅——實驗6

資料庫學習之旅——實驗6

本次實驗的目的是為了學習使用者自定義約束,並實踐使用者完整性,利用短語NOT NULL,UNIQUE,CHECK保證使用者定義完整性 。

使用者自定義完整性原理解析:

使用者完整性:

(1)域完整性是指資料庫表中的列必須滿足某種特定的資料型別或約束。域約束是最常見的使用者定義完整性約束,當有新資料插入到資料庫中,系統可以按照定義進行關係屬性取值是否正確的檢測。其中,約束又包括取值範圍精度等規定,表中的CHECK FOREIGN KEY 約束和DEFAULT NOT NULL定義都屬於域完整性的範疇。

(2)現在的RDBMS中,一般都有域完整性檢查功能。SQL SERVER提供了定義和檢驗這類完整性的機制,以便用統一方法進行處理。而不是應用程式來承擔這一功能。其他的完整性型別都支援使用者定義的完整性。

(3)一個屬效能否取空值一般由語義決定,也是域約束的內容之一。

以下是本次實驗的練習與習題答案:(school表在此並未發出,請參考之前的練習)

USE SCHOOL
--2.3.4實驗練習
--(1)建立WORKER表,並自定義兩個約束U1以及U2,其中U1規定NAME欄位唯一,U2規定SAGE(級別)欄位的上限是28。
CREATE TABLE WORKER
(
NUMBER CHAR(5),
NAME CHAR(8) CONSTRAINT U1 UNIQUE,
SEX CHAR(1),
SAGE INT CONSTRAINT U2 CHECK(SAGE<=28),
DEAPARTMENT CHAR(20),
CONSTRAINT PK_WORKER PRIMARY KEY(NUMBER)
)
SELECT * FROM WORKER

--(2)在WORKER表中插入一條合法記錄。
INSERT INTO WORKER(NUMBER,NAME,SEX,SAGE,DEAPARTMENT) VALUES('00001','張三','M',20,'CS');
SELECT * FROM WORKER;


--(3)演示插入違反U2約束的例子,U2規定元組的SAGE屬性的值必須小於等於28.
INSERT INTO WORKER(NUMBER,NAME,SEX,SAGE,DEAPARTMENT) VALUES('00002','李四','M',29,'CS');
INSERT INTO WORKER(NUMBER,NAME,SEX,SAGE,DEAPARTMENT) VALUES('00002','李四','M',28,'CS');
SELECT * FROM WORKER;


--(4)去除U2約束。
ALTER TABLE WORKER DROP U2;


--(5)重新插入(3)中想要插入的資料,由於去除了U2約束,所以插入成功。
INSERT INTO WORKER(NUMBER,NAME,SEX,SAGE,DEAPARTMENT) VALUES('00003','王四','M',29,'IS');
SELECT * FROM WORKER;

--(6)建立規則RULE_SEX,規定插入或更新的值只能是M或F,並繫結到WORKER的SEX欄位。
GO
CREATE RULE RULE_SEX AS @VALUE IN ('F','M');
GO
EXEC SP_BINDRULE RULE_SEX, 'WORKER.[SEX]';


--(7)演示違反規則RULE_SEX的插入操作。
INSERT INTO WORKER VALUES('00004','王浩','1','25','CS');
INSERT INTO WORKER VALUES('00004','王浩','F','25','CS');
SELECT * FROM WORKER;

針對以上練習,一下是自我練習題並附以答案:
--2.3.4自我實踐
--(1)加入約束U3,令SAGE的值大於等於0.
ALTER TABLE WORKER ADD CONSTRAINT U3 CHECK(SAGE>=0);


--(2)加入規則R2,確保插入的記錄的SAGE值在1到100之間,並繫結到SAGE屬性上。
GO
CREATE RULE R2 AS @VALUE BETWEEN 1 AND 100
GO
EXEC SP_BINDRULE R2, 'WORKER.[SAGE]'; 

執行結果請讀者自試。