數據庫系統之實體完整性約束


數據庫完整性

今天做了一道數據庫的上機題,其中的一些知識覺得挺有用的,因此打算整理出來一篇博客來與大家分享一下。這里的語句針對的都是創建表后所需要的語句。

一、題目

1.練習定義三類完整性:
(1)為student表添加主碼約束
(2)為course表添加主碼和外碼約束
(3)為sc表添加主碼和外碼約束
(4)為course表添加cname取值唯一的約束
(5)為course表添加credit默認值為4的default約束
(6)為student表添加check約束,ssex取值只能為男或女。
2.驗證上面添加的約束
(1) 將student表中學號為201910122的學號修改為201215123,驗證主碼約束機制。
(2) 將course表中課程號為6的先行課號修改為9,驗證外碼約束機制。
(3) 向sc表中添加一條記錄,(’666666666’,’1’,80),驗證外碼約束機制。
(4) 修改student表中學號為201215122的學生記錄,將學號修改為‘11111’驗證外碼約束機制。
(5) 刪除student表中學號為201215122的學生記錄,驗證外碼約束機制。
(6) 將course表中課程號為2號的課程名稱修改為數據庫,驗證唯一約束機制。
3.刪除上面添加的約束
(1)刪除student表的主碼約束
(2)刪除course表的外碼約束
(3)刪除course表中cname取值唯一的約束

二、題目准備

此次上機需要的各個數據庫各個字段的數據類型為:

1.student表

2.course表

3.sc表

此次上機需要的各個數據庫數據為:

1.student表

2.course表

3.sc表

三、題目分析

1.練習定義三類完整性:

(1)為student表添加主碼約束

添加主碼約束的MySQL語句是:alter table 表名 add primary key(列名);

因為主碼必須需要唯一並且數據不能重復,發現在student表中只有sno(學號)是每個人唯一標識。

因此這里只需輸入這個語句即可:alter table student add primary key(sno);

最后檢驗是否成功,輸入desc student;

(2)為course表添加主碼和外碼約束

1.添加主碼約束

根據第一步我們可以知道cno(課程號)是唯一標識

因此添加主碼約束的語句是:alter table course add primary key(cno);

最后檢驗是否成功,輸入desc course;

2.添加外碼約束

添加外碼約束的MySQL語句是:alter table 表名 add constraint 約束名 foreign key(關聯字段) references 主表(關聯字段)

其中constraint 約束名可以省略,即也可以寫成:alter table 表名 add foreign key(關聯字段) references 主表(關聯字段)

首先先嘗試一下使用course表的cpno來參照sc表的cpno:

alter table course add foreign key(cpno) references sc(cpno);

,發現報錯

這是因為在參照時候,參照的和被參照的都需要是同一種數據類型和長度,比如tinyint類型的只能參照tinyint類型的,不能參照char(9)類型的。同樣的,數據長度不一樣也不能進行參照,char(9)類型的也不能參照char(4)的

因此我們把cpno的數據類型更改一下再試一次

先更改cpno字段的數據類型:alter table sc modify cpno tinyint;

然后再次輸入上面的語句。

成功了

(3)為sc表添加主碼和外碼約束

1.添加主碼約束

根據第一步我們可以知道cpno是唯一標識

因此添加主碼約束的語句是:alter table sc primary key(cpno);

最后檢驗是否成功,輸入desc sc;

2.添加外碼約束

使用sc表的sno參照student的sno:alter table sc add foreign key(sno) references student(sno);

(4)為course表添加cname取值唯一的約束

添加取值唯一約束的MySQL的語句是:alter table 表名 add unique(列名);

因此我們輸入:alter table course add unique(cname);

使用desc course;驗證一下

其中PRI表示主鍵

UNI表示取值唯一約束

MUL表示外鍵

(5)為course表添加credit默認值為4的default約束

添加default約束的MySQL語句是:alter table 表名 alter 列名 set default '默認值';

因此輸入:alter table course alter credit set default '4';

最后檢驗是否成功,輸入desc course;

(6)為student表添加check約束,ssex取值只能為男或女。

添加check約束的MySQL語句是:alter table 表名 add check(約束條件);

因此這條語句是:alter table student add check(ssex="男" or ssex="女");

2.驗證上面添加的約束

(1) 將student表中學號為201910122的學號修改為201910123,驗證主碼約束機制。

修改元組的MySQL語句為:update 表名 set 列名=表達式 where 條件;

實現語句為:update student set sno='201910123' where sno='201910122';

此處表達的意思是因為有外碼約束,所以不能修改。

但是如果沒有這個外碼約束,它也修改不了。

我們知道,主碼的每個元組都必須不一樣,我們先看下我們的student表

其中sno是我們的主鍵,其中已經有‘201910123‘這個數據,因此根據主碼約束我們也修改不了

(2) 將course表中課程號為3的先行課號修改為4,驗證外碼約束機制。

根據第一步可以知道,實現語句為:update course set cno=4 where cno=3;

此處是因為cno是course的主鍵,所以此處報的是主鍵錯誤

沒有驗證的原因是因為我們在設置外碼的時候嗎,沒有讓別的外鍵關聯這個表的cno

如果想要實現的話,我們可以再添加一條關聯

語句為:alter table sc add foreign key(cno) references course(cno);

然后再驗證就會報因為外碼約束而錯誤了。

(3) 向sc表中添加一條記錄,(’666666666’,’1’,8,80),驗證外碼約束機制。

向表中追加元組的MySQL語句是:insert into 表名 values(值,值,···);

實現語句是:insert into sc values('666666666','1',8,80);

這個錯誤意思是關聯強制約束造成的錯誤,即因為外碼約束機制引起的錯誤。

(4) 修改student表中學號為201910122的學生記錄,將學號修改為‘11111’驗證外碼約束機制。

實現語句為:update student set sno='11111' where sno='201910122';

此處也成功驗證了外碼約束機制。

(5) 刪除student表中學號為201910122的學生記錄,驗證外碼約束機制。

刪除元組的MySQL語句是:delete from 表名 where 條件;

因此實現語句是:delete from student where sno='201910122';

成功驗證外碼約束機制。

(6) 將course表中課程號為2號的課程名稱修改為數據庫,驗證唯一約束機制。

實現語句是:update course set cname="數據庫" where cno=2;

此處我們首先查看一下course表的內容:

此處我們發現課程號為1的課程名已經是數據庫了,由唯一約束機制可知,cname的數據必須是唯一的,所以報錯。

成功驗證唯一約束機制。

3.刪除上面添加的約束

(1)刪除student表的主碼約束

首先刪除主碼約束的MySQL語句是:alter table 表名 drop primary key;

我們先輸入一下

此時我們發現一個問題,語句並沒有錯,但是不能刪除。

我們看一下錯誤內容:不能刪除主鍵:被某個外鍵所需要

因此我們也就知道了,要是我們想要刪除這個主鍵,必須先讓那個外鍵與這個主鍵的關聯斷開才行。

通過查看前面的語句,我們發現,這個外鍵是由sc表的sno與student表的sno關聯

刪除外碼約束的MySQL語句是:alter ![](https://img2020.cnblogs.com/blog/2309068/202110/2309068-20211015114119542-185235895.png) table 表名 drop foreign key 外碼名;

那么這個外碼名怎么知道呢,我們之前在創建的時候並沒有給它起別名,那么這個外碼名就是sno嗎?

不,並不是。

我們來查看一下,輸入show create table sc;

此時我們就能發現外碼名並不是sno,而是系統自動生成的一個名:sc_ibfk_1

因此刪除此處實現刪除外碼的語句是:alter table sc drop foreign key sc_ibfk_1;

刪除成功,此時我們再試一下刪除student的主碼,再次輸入:alter table student drop primary key;

student表的主碼刪除成功。

(2)刪除course表的外碼約束

根據第一步可知,我們首先應該查找course表的外碼名,

輸入語句:show create table course;

可以發現外碼名為course_ibfk_1

因此實現語句為:alter table course drop foreign key course_ibfk_1;

刪除course表的外碼成功。

(3)刪除course表中cname取值唯一的約束

刪除取值唯一約束的MySQL語句是:alter table 表名 drop key 約束名;

輸入:show create table course;

可以發現約束名為cname

實現語句為:alter table course drop key cname;

刪除成功。

四、參考鏈接

1.alter table添加表約束 - 流星一箭 - 博客園 (cnblogs.com)

2.MYSQL添加約束的兩種方法_keep-CSDN博客_mysql添加約束


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM