資料庫學習之旅——實驗6
阿新 • • 發佈:2019-01-08
本次實驗的目的是為了學習使用者自定義約束,並實踐使用者完整性,利用短語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]';
執行結果請讀者自試。