亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

MySQL數(shù)據(jù)庫之表的約束圖文詳解

 更新時間:2024年09月30日 09:08:15   作者:dbln  
在數(shù)據(jù)庫設(shè)計中,表約束是保證數(shù)據(jù)完整性、一致性的重要手段,數(shù)據(jù)類型本身就是一種基本約束,限制了數(shù)據(jù)的范圍和格式,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下

一、表的約束

前面我們所講到的數(shù)據(jù)類型就是一種表的約束。為什么這么說呢?因為數(shù)據(jù)類型有自己的大小,也就是我們插入的數(shù)據(jù)是有范圍的,不能夠隨意插入,這就對程序員的插入操作作了規(guī)范和約束,保證了插入的數(shù)據(jù)的合法性和完整性以及可預(yù)期性。

但是數(shù)據(jù)類型約束很單一,需要有一些額外的約束,更好的保證數(shù)據(jù)的合法性,從業(yè)務(wù)邏輯角度保證數(shù)據(jù)的正確性。比如:身高不能為負(fù)數(shù),每個人的電話號碼都是唯一的等。

約束本質(zhì):通過技術(shù)手段,倒逼程序員,插入正確的數(shù)據(jù)。

二、空屬性

null(默認(rèn)的)和 not null(不為空)

數(shù)據(jù)庫默認(rèn)字段基本都是字段為空,但是實際開發(fā)時,盡可能保證字段不為空,因為數(shù)據(jù)為空沒辦法參與運算。并且有的數(shù)據(jù)是不能為空的。

比如,在學(xué)校中,一個學(xué)生一定有其所在的班級,且不能為空,因為某個學(xué)生一定是屬于一個確定的班級的,并且這個班級所在的教室也是確定的且不能為空,不然學(xué)生就不知道在哪里上課了。所以如果我們要創(chuàng)建一個學(xué)生的信息表的話,這兩個字段不能夠為空。 

我們先創(chuàng)建一個學(xué)生信息表:

mysql> create table stu(
    -> name varchar(20),
    -> class_name varchar(20) not null,
    -> class_room varchar(20) not null
    -> );

如下圖的表結(jié)構(gòu):null一欄,yes表示可以為空,no表示不能為空。 

然后我們向其中插入一些數(shù)據(jù):

而如果我們插入null數(shù)據(jù)的話,就會出錯:

而允許為空的列,它的默認(rèn)值是null。所以如果插入null,則是合法的:

三、默認(rèn)值

默認(rèn)值(default):某一種數(shù)據(jù)會經(jīng)常性的出現(xiàn)某個具體的值,可以在一開始就指定好,在需要真實數(shù)據(jù)的時候,用戶可以選擇性的使用默認(rèn)值。

下面我們在學(xué)生信息表中插入一列年齡信息,并設(shè)置其默認(rèn)值是18。

下面我們進行包含age數(shù)據(jù)的插入,和不包含age數(shù)據(jù)的插入:

我們發(fā)現(xiàn),如果用戶指明了年齡,就使用用戶指定的年齡,如果用戶沒有指明年齡,就使用我們設(shè)置的默認(rèn)值。默認(rèn)值的生效:數(shù)據(jù)在插入的時候不給該字段賦值,就使用默認(rèn)值。

如果沒有明確指定一列要插入,用的是default值,而如果沒有設(shè)置default值,就會出錯:比如下面,name就沒有設(shè)置default值。

注:只有設(shè)置了default的列,才可以在插入值的時候,對列進行省略。

四、列描述

列描述:comment,沒有實際含義,專門用來描述字段,會根據(jù)表創(chuàng)建語句保存,用來給程序員或DBA來進行了解列字段的含義。

具體使用方式如下:

mysql> create table users(
    -> name varchar(20) comment '用戶名字',
    -> address varchar(32) comment '用戶地址',
    -> telephone int comment '用戶電話'
    -> );

五、zerofill

引列:對于下表。

mysql> create table t12(
    -> id int
    -> );

我們查看一下它的屬性:

我們發(fā)現(xiàn),int類型后面還跟了一個數(shù)字10。它肯定不是表示int類型的大小,因為int類型的大小是4字節(jié),那么這個10代表什么意思呢? 

其實沒有zerofill這個約束的話,括號內(nèi)的數(shù)字是毫無意義的。所以我們需要將他們結(jié)合起來理解。

比如,對于下表:

mysql> create table t12(
    -> a int(5),
    -> b int(5)
    -> );

一般情況下,我們向表中插入數(shù)據(jù)沒有什么特別的地方:

但是對列添加了zerofill約束后,顯示的結(jié)果就有所不同了。修改t12表中,b的約束條件:

alter table t12 change b b int(5) zerofill;

然后,我們再查看t12表中的數(shù)據(jù):

其實,int身后括號里面的數(shù)字就表示數(shù)值顯示的寬度。這里面顯示的寬度是5。加了zerofill約束后,這次可以看到b的值由原來的2變成00002,這就是zerofill約束的作用,如果寬度小于設(shè)定的寬度(這里設(shè)置的是5),自動填充0。

根據(jù)上面的結(jié)果,要注意的是,這只是最后顯示的結(jié)果,在MySQL中實際存儲的還是1??梢钥闯鰯?shù)據(jù)庫內(nèi)部存儲的還是1,00001只是設(shè)置了zerofill屬性后的一種格式化輸出而已。

六、主鍵

主鍵:primary key用來唯一的約束該字段里面的數(shù)據(jù),不能重復(fù),不能為空,一張表中最多只能有一個主鍵。主鍵所在的列通常是整數(shù)類型。

創(chuàng)建表的時候直接在字段上指定主鍵約束(primary key)。我們先創(chuàng)建一個包含主鍵約束的學(xué)生信息表:

mysql> create table stu(
    -> id int primary key,
    -> name varchar(20),
    -> password int
    -> );

然后查看其列屬性:列屬性中key一列中pri表示該字段是主鍵。

先插入兩條數(shù)據(jù):

如果我們再插入一條id為2的記錄,就會報錯:

報錯的提示信息就是id為2的主鍵沖突了。即主鍵對應(yīng)的字段中不能重復(fù),一旦重復(fù),插入操作就會失敗。

當(dāng)表創(chuàng)建好以后,但是沒有在創(chuàng)建時就指定主鍵的時候,可以再次追加主鍵。

alter table 表名 add primary key(字段列表);

當(dāng)你不再需要主鍵的時候, 可以刪除主鍵:

alter table 表名 drop primary key;

復(fù)合主鍵:在創(chuàng)建表的時候,在所有字段之后,使用primary key來創(chuàng)建主鍵,如果設(shè)置多個字段作為主鍵,這就是復(fù)合主鍵。 

我們先創(chuàng)建一個包含復(fù)合主鍵約束的學(xué)生信息表:id表示學(xué)生編號,crouse_id表示課程編號,score表示該學(xué)生該課程的分?jǐn)?shù)。

mysql> create table stu(
    -> id int,
    -> crouse_id int,
    -> score int,
    -> primary key(id,crouse_id)
    -> );

 然后我們向其中插入一些數(shù)據(jù):

我們發(fā)現(xiàn),對于復(fù)合主鍵,這里是(id,crouse_id),只要兩個中有一個和表中數(shù)據(jù)不一樣,就可以插入成功。如果兩個中同時和表中的數(shù)據(jù)沖突了,那么插入失敗。也就是說,(id,crouse_id)同時構(gòu)成了主鍵。用上面的例子解釋的話,就是一個同學(xué)可以選多個課程,多個同學(xué)選同一個課程,但是同一個同學(xué)不能多次選擇同一個課程。 

七、自增長

auto_increment:當(dāng)對應(yīng)的字段不給值,會自動的被系統(tǒng)觸發(fā),系統(tǒng)會從當(dāng)前字段中已經(jīng)有的最大值 +1操作,得到一個新的不同的值。通常和主鍵搭配使用,作為邏輯主鍵。

自增長的特點:

~ 任何一個字段要做自增長,前提是本身是一個索引(key一欄有值)。

~ 自增長字段必須是整數(shù)。

~ 一張表最多只能有一個自增長。

我們先創(chuàng)建一個包含自增長約束的信息表:

mysql> create table stu(
    -> id int primary key auto_increment,
    -> name varchar(20)
    -> );

然后我們插入一些數(shù)據(jù),并進行查詢:

我們發(fā)現(xiàn),有了自增長約束,我們不需要手動插入id數(shù)據(jù),并且每次插入它還會自加1。這樣還保證了主鍵不會沖突。 

如果我手動插入id,會是怎么樣呢?

從上面的結(jié)果可以看出,如果我們手動插入, 就會是我們用戶自己指定的數(shù)據(jù)進行插入。而下一次插入時,也不指定id的話,id就會從13開始自增。

當(dāng)然,我們也可以在創(chuàng)建表的時候就指定自增長值: 

mysql> create table stu1(
    -> id int primary key auto_increment,
    -> name varchar(20)
    -> )auto_increment=10;

 插入數(shù)據(jù):

八、唯一鍵

一張表中有往往有很多字段需要唯一性,使其數(shù)據(jù)不能重復(fù)。但是一張表中只能有一個主鍵,所以唯一鍵就可以解決表中有多個字段需要唯一性約束的問題。

唯一鍵的本質(zhì)和主鍵差不多,唯一鍵允許為空,而且可以多個為空,空字段不做唯一性比較。

我們創(chuàng)建如下的學(xué)生信息表:

mysql> create table stu(
    -> id int primary key auto_increment,
    -> telphone int unique key
    -> );

如下,key一列中的UNI就表示該字段是唯一鍵: 

然后我們向表中插入一些數(shù)據(jù):

我們發(fā)現(xiàn),如果telphone插入相同的值就會報錯,報錯就是唯一鍵發(fā)生了沖突。

唯一鍵是可以為空的:

唯一鍵  VS 主鍵 

主鍵:主要是用來標(biāo)識表中一條數(shù)據(jù)的唯一性。

唯一鍵:主要是用來標(biāo)識某一列的字段的數(shù)據(jù)不能出現(xiàn)重復(fù)。 

九、外鍵

外鍵用于定義主表和從表之間的關(guān)系:外鍵約束主要定義在從表上,主表則必須是有主鍵約束或unique約束。當(dāng)定義外鍵后,要求外鍵列數(shù)據(jù)必須在主表的主鍵列存在或為null。

語法:

foreign key (字段名) references 主表(列)

下面創(chuàng)建一張班級信息表(主表):

mysql> create table class(
    -> id int primary key,
    -> name varchar(20) not null
    -> );

插入一些數(shù)據(jù):

再創(chuàng)建一張學(xué)生表(從表):

create table stu( 
id int primary key, 
name varchar(20) not null, 
class_id int, 
foreign key (class_id) references class(id)
);

下圖,key列 MUL 就表示該字段是外鍵。 

 插入數(shù)據(jù):

如果我們在stu表中插入class表中不存在的班級會發(fā)生什么呢?插入一個班級號為3的學(xué)生,因為class表中沒有這個班級,所以插入失敗了。

我們發(fā)現(xiàn),報錯提示會告訴我們不存在3號外鍵。

如下圖,如果我們想要刪除班級號為1的班級信息,就會報錯,因為班級號為1的班級里還有學(xué)生。

總結(jié)

到此這篇關(guān)于MySQL數(shù)據(jù)庫之表的約束的文章就介紹到這了,更多相關(guān)MySQL表的約束內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論