實驗六:數(shù)據(jù)完整性實驗(SQL SERVER版)
實驗?zāi)康模?/strong>
加深對數(shù)據(jù)完整性的理解。
實驗內(nèi)容:
數(shù)據(jù)庫的完整性設(shè)置。
實驗步驟:
可視化界面的操作方法:
一、實體完整性
1.將student表的“sno”字段設(shè)為主鍵:在表設(shè)計界面中,單擊左邊的行選定塊,選定“sno”字段,單擊工具按鈕
圖6-1
2. 將“sc”表的“sno”和“cno”設(shè)置為主鍵:在表設(shè)計界面中,單擊并拖動左邊的行選定塊,選定sno和cno字段,單擊工具按鈕
圖6-2
二、域完整性
3. 將“ssex”字段設(shè)置為只能取“男”,“女”兩值:在表設(shè)計界面,點擊圖4-3箭頭所指按鈕,出現(xiàn)屬性(Property)對話框,選擇新建(New)按鈕,然后在約束表達(dá)式(Constraint expression)框中輸入“ ssex in ('男','女') ”。如圖6-3所示。
圖6-3
三、參照完整性
4. 將“student”表和“sc”表中的“sno”字段設(shè)為參照: 打開“sc”表的設(shè)計界面, 點擊工具欄按鈕 , 在彈出的屬性(properties)對話框中點擊“新建”按鈕,在“主鍵表(Primary key table)”下拉框中選擇“student”表,在其下的字段選擇框中選擇“sno”,在“外鍵表(Foreign key table)”下拉框中選擇“sc”表,在其下的字段選擇框中選擇“sno”,單擊關(guān)閉即可。見圖6.4。
圖6.4
命令方式操作方法:
一、實體完整性
1.將“student”表的“sno”字段設(shè)為主鍵:
當(dāng)“student”表已存在則執(zhí)行:
alter table student add constraint pk_sno primary key (sno)
當(dāng)“student”表不存在則執(zhí)行:
Create table student(sno CHAR(5) primary key ,
sname CHAR(10),ssex CHAR(2),
sage int,sdept CHAR(4))
注:可用命令“drop table student”刪除“student”表
2. 添加一身份證號字段,設(shè)置其惟一性.(注: 操作前應(yīng)刪除表中的所有記錄)
Alter table student add id char(18) unique (id)
3. 將“sc”表的“sno”和“cno”設(shè)置為主鍵:
當(dāng)“sc”表已存在則執(zhí)行:
alter table sc add constraint PK_SnoCno primary key (sno,cno)
當(dāng)“sc”表不存在則執(zhí)行:
Create table sc(sno CHAR(5),cno CHAR(2),
grade INT NULL,
constraint PK_SnoCno primary key (sno,cno))
二、域完整性
4. 將“ssex”字段設(shè)置為只能取“男”,“女”兩值:
當(dāng)“student”表已存在則執(zhí)行:
alter table student add constraint CK_Sex check (ssex in ('男' ,'女'))
當(dāng)“student”表不存在則執(zhí)行:
Create table student(sno CHAR(5) primary key ,
sname CHAR(10),
ssex CHAR(2) check (ssex in ('男' ,'女')) ,
sage int, sdept CHAR(4))
5. 設(shè)置學(xué)號字段只能輸入數(shù)字:
alter table student add constraint CK_Sno_Format check (sno like '[0-9][0-9][0-9][0-9][0-9]')
6. 設(shè)置身份證號的輸入格式:
alter table student add constraint CK_ID_Format check ((id like '[0-9][0-9][0-9][0-9][0-9][0-9][1-2][0-9][0-9][0-9][0-1][0-9][0-3][0-9][0-9][0-9][0-9]_') OR (id like '[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-1][0-9][0-3][0-9][0-9][0-9][0-9]'))
7. 設(shè)置18位身份證號的第7位到第10位為合法的年份(1900-2050)
alter table student add constraint CK_ID_Format2 check ( not len(id)=18 or ( (convert(smallint,substring(id,7,4) )>=1900) and(convert(smallint,substring(id,7,4) )<=2050)) )
三、參照完整性
9. 設(shè)置男生的年齡必須大于22, 女生的年齡必須大于20.
Alter table student add constraint CK_age check (sex='男' and sage>=22 or sex='女' and sage>=20 )
10. 將“student”表和“sc”表中的“sno”字段設(shè)為參照:
當(dāng)“sc”表已存在則執(zhí)行:
alter table sc add constraint FP_sno foreign key (sno) references student(sno )
當(dāng)“sc”表不存在則執(zhí)行:
Create table sc(sno CHAR(5) constraint FP_sno
foreign key references student(sno),
cno CHAR(2),grade INT NULL,
constraint PK_SnoCno primary key (sno,cno) )
四、完整性驗證
1. 實體完整性: 在“student”表數(shù)據(jù)瀏覽可視化界面中輸入學(xué)號相同的兩條記錄將會出現(xiàn)錯誤如下圖所示:
或者在命令窗口輸入下面兩條命令也會出現(xiàn)錯誤提示:
insert into student values('95001','張三','男',20,'CS')
insert into student values('95001','李四','女',18,'CS')
下面的語句用來驗證“sc”表中的實體完整性:
insert into sc values('95002', '10',65)
insert into sc values('95002', '10',90)
2. 域完整性:
使用下面的語句驗證“ssex”字段的域完整性:
insert into student values('95009','張勻','大',20,'CS')
3.參照完整性:
使用下面的語句“驗證”sc表中的“sno”字段的域完整性(假設(shè)student表中沒有學(xué)號為“95998”的學(xué)生記錄):
insert into sc values('98998', '10',98)
思考:
1.建立課程的實體完整性, 和課程號cno的參照完整性;
2.建立年齡的域完整性, 約束條件為“年齡在15到30歲之間”
3*. 在學(xué)生表中添加“出生日期”和“身份證號”字段,設(shè)置一完整性規(guī)則,確保身份證號中的關(guān)于出生日期的數(shù)字與“出生日期”字段的值相匹配。