??????今天給各位帶來的是關于數據庫約束方面的知識
清風的CSDN博客
😛😛😛希望我的文章能對你有所幫助,有不足的地方還請各位看官多多指教,大家一起學習交流!
動動你們發財的小手,點點關注點點贊!在此謝過啦!哈哈哈!😛😛😛
目錄
?一、NULL約束
二、UNIQUE約束?
?三、DEFAULT約束
四、PRIMARY KEY約束
五、FOREIGN KEY約束?
5.1 語法
5.2 案例代碼
?
?一、NULL約束
NOT NULL - 指示某列不能存儲 NULL 值。
現在我們創建一個student表:
create table student(id int, name varchar(20));
?可以看到,當我們沒有進行約束的時候,id 和 name 都是可以為NULL的。
?當前這個表沒有任何的約束,所以在往表里插入NULL的時候也是可以的:
insert into student values (null, null);
那么,現在來修改一下這個student,給這個表加上NOT-NULL約束:
create table student (id int not null,name varchar(20));
那么現在就可以看到兩個表的差別了,第二次創建的表,對于id這一列,是不允許為空的。
所以當我們在插入NULL的時候,有了NOT-NULL的約束,程序就不會正常運行了:
insert into student (null,null);
對于NULL約束,還是比較容易理解的。
二、UNIQUE約束?
?
create table student(id int, name varchar(20));insert into student values (1,'張三');
?此時我們創建studenet表時加入UNIQUE約束,并插入張三的記錄:
create table student (id int unique, name varchar(20));
insert into student values (1,'張三');
加入UNIQUE約束后,可以看到,id這一列的key是UNI(UNIQUE)的縮寫:
因此,加入UNIQUE 約束之后,后續進行插入/修改的時候,都會先進行查詢,看當前這個被約束的列的值是否已經存在。約束雖然能夠引入更多的檢查操作,也會增加系統的開銷。
?三、DEFAULT約束
DEFAULT - 規定沒有給列賦值時的默認值
進行指定列插入的時候,其他未被指定到的列就會被設成默認值。
?在這里我們還是以上面的student為例,重新創建student表并不加任何約束:
create table student(id int, name varchar(20));
創建表的時候,我們并沒有加任何默認值約束,可以看到student表中的默認值為NULL。
當我們對student表進行指定列插入:
insert into student (id) values (1);
insert into student (name) values ('張三');
這里可以看到,進行指定列插入的時候,沒有被指定的列,默認就是為NULL。
此時我們給student表加上DEFAULT約束:
create table student (id int default 0,name varchar(20) default '無名氏');
這樣一來,再次進行指定列插入的時候,沒有被指定的列就會被設定為創建表時候給的默認值。
四、PRIMARY KEY約束
create table student (id int primary key,name varchar(20));
需要注意一下,一張表里面只能有一個PEIMARY KEY約束。(非空&唯一)
通常創建表的時候都會指定一個主鍵。除了上面基礎的使用之外,還有一種情況-聯合主鍵,它也是只有一個主鍵,但是這個主鍵是由多個列聯合構成的。這里不做贅述。
加入主鍵約束后,插入記錄的時候,主鍵的列是不能為空的:
insert into student values (1,'張三');
insert into student values (1,'張三);
//再次插入和第一條同樣的記錄
insert into student values (1,'張三);
再次插入和第一條同樣的記錄,程序就會報錯,因為記錄重復。
五、FOREIGN KEY約束?
5.1 語法
foreign key (字段名) references 主表(列)
5.2 案例代碼
創建班級表:
create table class (class_ID int, name varchar(20));
創建學生表:
create table student (id int, name varchar(20),class_Id int);
班級是要包含學生的,比如說班級現在有這樣幾個插入的數據:
insert into class values (1,'210701班'),(2,'210702班'),(3,'210703班');
insert into student values (1,'張三',1),(2,'李四',2),(3,'王五',100);
? ? ? ? 現在,王五這個同學,不在班級表中存在,因此,這是一個不太科學的數據。而引入外鍵約束,就是為了解決這個問題。也就是說,希望學生表中的class_ID 都在班級表中存在,此時就可以使用外鍵約束。
create table class (class_ID int primary key,name varchar(20));create table student (id int primary key, name varchar(20), class_ID int, foreign key (class_ID) references class(class_ID));
? ? ? ?前面說到的約束,都是在定義表的時候,哪一列需要約束,就創建到哪一列的后面。而外鍵約束,則是寫到最后。即把所有前面的列都定義好了之后,在最后通過FOREIGN KEY創建外鍵約束。
創建外鍵的時候,要指定三個信息:
- 本表哪個列
- 引用自哪個表(references)
- 引用自另外一個表的哪個列
此時就要求,本表(student)中這個列的數據必須要在引用的另外一個表的對應列中存在,這個情況下,也可以認為,班級表約束了學生表。把這種約束其他表的表,稱為父表,而把學生表這種被約束的表,成為子表。
引入外鍵之后,就會在對應的父表中檢查子表插入的值是否在父表中存在,不存在就報錯。其實,外鍵約束是雙向的,父表約束子表,子表也會約束父表。比如:要想刪除父表的記錄,必須先刪除子表對應的數據,確保子表中沒有數據引用父表的記錄。
?好啦,今天的分享就到這里!之后,我會給大家分享一些復雜查詢,比如聯合查詢,聚合查詢,子查詢等。
🎉希望各位看官讀完文章后,能夠有所提升。
?創作不易,還希望各位大佬支持一下!
👍點贊,你的認可是我創作的動力!
?收藏,你的青睞是我努力的方向!
??評論:你的意見是我進步的財富!
?
?
?