數(shù)據(jù)庫(kù)原理及MySQL應(yīng)用|約束-創(chuàng)新互聯(lián)

網(wǎng)站建設(shè)公司,為您提供網(wǎng)站建設(shè),網(wǎng)站制作,網(wǎng)頁(yè)設(shè)計(jì)及定制網(wǎng)站建設(shè)服務(wù),專注于成都定制網(wǎng)站,高端網(wǎng)頁(yè)制作,對(duì)成都銅雕雕塑等多個(gè)行業(yè)擁有豐富的網(wǎng)站建設(shè)經(jīng)驗(yàn)的網(wǎng)站建設(shè)公司。專業(yè)網(wǎng)站設(shè)計(jì),網(wǎng)站優(yōu)化推廣哪家好,專業(yè)成都網(wǎng)站推廣優(yōu)化,H5建站,響應(yīng)式網(wǎng)站。

約束是保證數(shù)據(jù)完整性的一種數(shù)據(jù)庫(kù)對(duì)象,按約束作用不同,分為七種。

約束從字面上來(lái)看就是受到限制,它是附加在表上,通過(guò)限制列中、行中、表之間數(shù)據(jù)來(lái)保證數(shù)據(jù)完整性的一種數(shù)據(jù)庫(kù)對(duì)象。

在MySQL中,有多種約束,可按以下不同方式進(jìn)行分類。

● 按約束的應(yīng)用范圍不同,約束可分為列級(jí)約束和表級(jí)約束。列級(jí)約束是數(shù)據(jù)表中列定義的一部分,只能作用于表中的一列;表級(jí)約束獨(dú)立于列定義之外,作用于表中的多列。當(dāng)一個(gè)約束中必須包含多個(gè)列時(shí),必須使用表級(jí)約束。

● 按約束的作用不同,約束可分為主鍵約束(PRIMARY KEY)、唯一性約束(UNIQUE)、外鍵約束(FOREIGN KEY)、默認(rèn)值約束(DEFAULT)、非空約束(NOT NULL)、自增特性(AUTO_INCREMENT)和檢查約束(CHECK)。

提示/

給約束定義的名稱,稱之為約束名。約束名可以由用戶自己指定,也可由系統(tǒng)指定。對(duì)于約束名的命名推薦為type_table_column,其中type表示約束的類型,table為表名,column為列名,例如:PK_books_bookID表示在圖書表books的bookID列上創(chuàng)建了主鍵約束。

約束創(chuàng)建的時(shí)機(jī),分為以下兩種。

(1) 在建表的同時(shí)創(chuàng)建約束。

(2) 建表后(修改表)創(chuàng)建約束。

01、主鍵約束

主鍵約束(PRIMARY KEY)是在表中定義一個(gè)主鍵來(lái)唯一確定表中的每一行記錄。主鍵可以定義在單列上,也可以定義在多列上。該約束通過(guò)主鍵索引來(lái)強(qiáng)制實(shí)體完整性。

主鍵約束具有以下特點(diǎn)。

每個(gè)表最多只能定義一個(gè)主鍵約束,外鍵約束使用它作為維護(hù)數(shù)據(jù)完整性的參考點(diǎn)。

● 主鍵約束所在列不允許輸入重復(fù)值。如果主鍵約束由兩個(gè)或兩個(gè)以上的列組成,則該組合的取值不重復(fù)。

● 在主鍵約束中定義的所有列都必須定義為非空(NOT NULL)。

● 主鍵約束名總為PRIMARY,所以不需要指定約束名。

● 主鍵約束在指定的列上創(chuàng)建了一個(gè)主鍵索引,索引名默認(rèn)為PRIMARY。

● 關(guān)系模型理論要求為每個(gè)表定義一個(gè)主鍵,但MySQL并沒(méi)有這樣的要求,可以創(chuàng)建一個(gè)沒(méi)有主鍵的表,但是從安全角度考慮應(yīng)該為每個(gè)表指定一個(gè)主鍵。

當(dāng)在一個(gè)已經(jīng)存放了數(shù)據(jù)的表上增加主鍵約束時(shí),MySQL會(huì)自動(dòng)對(duì)表中的數(shù)據(jù)進(jìn)行檢查,以確保這些數(shù)據(jù)能夠滿足主鍵約束的要求,即設(shè)定主鍵約束的列的所有數(shù)據(jù)值必須唯一,否則系統(tǒng)會(huì)返回錯(cuò)誤信息,并拒絕執(zhí)行增加約束的操作。

主鍵約束的基本語(yǔ)法格式如下所示。

語(yǔ)法說(shuō)明如下。

  • 如果定義的是列級(jí)約束,則不需要指定列名column,只需在列定義的后面加上PRIMARY KEY。

  • 如果定義的是表級(jí)約束,則需要指定主鍵所在列名,在表定義語(yǔ)句后,加上該子句。

提示/

創(chuàng)建主鍵約束時(shí)系統(tǒng)會(huì)自動(dòng)創(chuàng)建一個(gè)主鍵索引,該索引不同于手工創(chuàng)建的索引,不能使用DROP INDEX語(yǔ)句直接刪除,只有刪除主鍵約束,才能刪除其相應(yīng)的索引。

如果有外鍵約束正在參考主鍵約束中的數(shù)據(jù),那么這些主鍵約束中的數(shù)據(jù)便不能被修改,也不能被刪除。但是,如果在創(chuàng)建外鍵約束時(shí),指定了級(jí)聯(lián)操作子句,就可以修改或刪除主鍵約束中的數(shù)據(jù)了。

1. 創(chuàng)建數(shù)據(jù)表時(shí)添加主鍵約束

在創(chuàng)建數(shù)據(jù)表時(shí)可以將一列或多列的組合設(shè)置為主鍵約束,該約束由系統(tǒng)提供主鍵約束名PRIMARY,因此即便人工設(shè)置約束名的命令可以成功運(yùn)行,但系統(tǒng)仍然將PRIMARY作為主鍵約束名。

【例6-25】在圖書銷售數(shù)據(jù)庫(kù)booksale中創(chuàng)建圖書表books2,其中將bookid列設(shè)置為主鍵,然后查看約束信息及索引情況。

可以從information_schema架構(gòu)下的系統(tǒng)表查看約束。其中CONSTRAINT_NAME列為約束名,CONSTRAINT_TYPE列為約束類型。創(chuàng)建books2表的同時(shí)創(chuàng)建了一個(gè)主鍵約束,這個(gè)主鍵約束是一個(gè)列級(jí)約束,默認(rèn)的主鍵約束名為PRIMARY,約束類型為PRIMARY KEY。創(chuàng)建該主鍵約束的同時(shí)還創(chuàng)建了一個(gè)主鍵索引,索引和約束同名為PRIMARY,索引關(guān)鍵字是bookid。

輸入以下數(shù)據(jù)進(jìn)行驗(yàn)證。

數(shù)據(jù)正常插入,再輸入以下數(shù)據(jù)進(jìn)行驗(yàn)證。

插入失敗,提示錯(cuò)誤信息:[Err] 1062-Duplicate entry '1' for key 'books2.PRIMARY'。因?yàn)閎ookid的值“1”是重復(fù)的,違反了主鍵約束。

【例6-26】在圖書銷售數(shù)據(jù)庫(kù)booksale中創(chuàng)建訂單項(xiàng)目表orderitems2,該表的主鍵約束設(shè)置在orderid和bookid兩列上,然后查看約束信息及索引情況。

創(chuàng)建orderitems2表的同時(shí)創(chuàng)建了一個(gè)主鍵約束,這個(gè)主鍵約束是一個(gè)表級(jí)約束,默認(rèn)的主鍵約束名為PRIMARY,約束類型為PRIMARY KEY。創(chuàng)建該主鍵約束的同時(shí)還創(chuàng)建了一個(gè)主鍵索引,索引和約束同名為PRIMARY,索引第一關(guān)鍵字是orderid,第二關(guān)鍵字是bookid。

輸入以下數(shù)據(jù)進(jìn)行驗(yàn)證。

插入成功,因?yàn)橹麈I建立在orderid和bookid兩列上,因此只有orderid列值相同或bookid列值相同不違反主鍵約束,只有orderid和bookid兩列上的值都重復(fù)時(shí),才會(huì)違反主鍵約束,導(dǎo)致插入失敗。

2. 修改數(shù)據(jù)表時(shí)添加主鍵約束

如果創(chuàng)建數(shù)據(jù)表時(shí)沒(méi)有指定主鍵約束,可以在修改數(shù)據(jù)表時(shí)設(shè)置主鍵約束。

【例6-27】在圖書銷售數(shù)據(jù)庫(kù)booksale的表categories中,為ctgcode列添加主鍵約束。

系統(tǒng)默認(rèn)的主鍵約束名為PRIMARY。若categories表的ctgcode列所有取值均唯一,則主鍵約束可以成功建立,否則將會(huì)創(chuàng)建失敗。

提示/

在修改表時(shí)添加主鍵需要注意,由于表中已經(jīng)存在數(shù)據(jù),若設(shè)置主鍵的列存在違反實(shí)體完整性的情況,則主鍵約束無(wú)法創(chuàng)建成功。

3. 刪除主鍵約束

一個(gè)表只允許有一個(gè)主鍵約束,對(duì)于已存在的主鍵約束,可以修改或刪除它。例如:要將其他列或列組合設(shè)為主鍵約束,必須先刪除現(xiàn)有的主鍵約束,然后再重新創(chuàng)建。

【例6-28】在圖書銷售數(shù)據(jù)庫(kù)booksale的表categories中,刪除現(xiàn)有的主鍵約束。

主鍵約束刪除的同時(shí),自動(dòng)生成的主鍵索引也同步刪除。

02、唯一性約束

唯一性約束(UNIQUE)是用來(lái)保證數(shù)據(jù)表中的一列或多列中的數(shù)據(jù)是唯一的。該約束通過(guò)唯一性索引來(lái)強(qiáng)制實(shí)體完整性。當(dāng)表中已經(jīng)存在主鍵約束時(shí),如果需要在其他列上實(shí)現(xiàn)實(shí)體完整性,由于一個(gè)表中只能有一個(gè)主鍵約束,因此可以通過(guò)創(chuàng)建唯一性約束來(lái)實(shí)現(xiàn)。

當(dāng)在一個(gè)已經(jīng)存放了數(shù)據(jù)的表上增加唯一性約束時(shí),MySQL會(huì)自動(dòng)對(duì)表中的數(shù)據(jù)進(jìn)行檢查,以確保這些數(shù)據(jù)能夠滿足唯一性約束的要求,即設(shè)定唯一性約束的列除NULL外,所有數(shù)據(jù)的值必須唯一,否則系統(tǒng)會(huì)返回錯(cuò)誤信息,并拒絕執(zhí)行增加約束的操作。

唯一性約束具有以下特點(diǎn)。

● 每個(gè)表可以定義多個(gè)唯一性約束,且多個(gè)唯一性約束的列可以重合。

● 唯一性約束所在列不允許輸入重復(fù)值。如果唯一性約束由兩個(gè)或兩個(gè)以上的列組成,則該組合的取值不重復(fù)。

● 唯一性約束所在列允許取空值,但必須用NULL聲明。不過(guò),當(dāng)和參與唯一性約束的任何值一起使用時(shí),每列只允許一個(gè)空值。

● 唯一性約束在指定的列上創(chuàng)建了一個(gè)唯一性索引。?

提示/

主鍵約束和唯一性約束的區(qū)別是:一個(gè)表只允許建立一個(gè)主鍵約束,而唯一性約束可以建立多個(gè);主鍵約束的關(guān)鍵列不允許取空值,而唯一性約束的關(guān)鍵列允許取空值;主鍵約束默認(rèn)創(chuàng)建的是主鍵索引,唯一性約束默認(rèn)創(chuàng)建的是唯一性索引。

唯一性約束的基本語(yǔ)法格式如下所示。

語(yǔ)法說(shuō)明如下。

  • constraint_name是可選選項(xiàng),用于指定約束的名稱。如果用戶沒(méi)有提供約束名稱,系統(tǒng)將會(huì)自動(dòng)生成一個(gè)以被約束列名命名的約束名稱。約束名稱大長(zhǎng)度為64個(gè)字符,而且區(qū)分大小寫。

  • UNIQUE是定義唯一性約束的命令關(guān)鍵字。

  • 如果定義的是列級(jí)約束,且不需要指定約束名,則不需要指定列名column,只需在列定義的后面加上UNIQUE。

  • 如果定義的是表級(jí)約束,或是列級(jí)約束但要指定約束名,則需要指定唯一性約束所在列名,在表定義語(yǔ)句后,加上該子句。

1. 創(chuàng)建數(shù)據(jù)表時(shí)添加唯一性約束

在創(chuàng)建數(shù)據(jù)表時(shí)可以為一列或多列的組合設(shè)置唯一性約束,該約束可由系統(tǒng)提供唯一性約束名,也可由用戶指定唯一性約束名。

【例6-29】在圖書銷售數(shù)據(jù)庫(kù)booksale中創(chuàng)建圖書類別表categories2,為ctgcode列創(chuàng)建唯一性約束,然后查看約束信息及索引情況。

創(chuàng)建categories2表的同時(shí)創(chuàng)建了一個(gè)唯一性約束,這個(gè)唯一性約束是一個(gè)列級(jí)約束,默認(rèn)的約束名為被約束列名ctgcode,約束類型為UNIQUE。創(chuàng)建該唯一性約束的同時(shí)還創(chuàng)建了一個(gè)唯一性索引,索引和約束同名為ctgcode,索引關(guān)鍵字是ctgcode。

輸入以下數(shù)據(jù)進(jìn)行驗(yàn)證。

數(shù)據(jù)正常插入,再輸入以下數(shù)據(jù)進(jìn)行驗(yàn)證。

插入失敗,提示錯(cuò)誤信息:

因?yàn)閏tgcode的值'computer'是重復(fù)的,違反了唯一性約束。

【例6-30】在圖書銷售數(shù)據(jù)庫(kù)booksale中創(chuàng)建顧客表customers2,為emailaddress列設(shè)置唯一性約束,約束名為UN_customers2_emailaddress,然后查看約束信息及索引情況。

創(chuàng)建customers2表的同時(shí)創(chuàng)建了一個(gè)主鍵約束和一個(gè)唯一性約束,這兩個(gè)約束都是列級(jí)約束,主鍵約束名為系統(tǒng)默認(rèn)的約束名PRIMARY,約束類型為PRIMARY KEY,唯一性約束名為指定的約束名UN_customers2_emailaddress,約束類型為UNIQUE。創(chuàng)建該主鍵約束的同時(shí)還創(chuàng)建了一個(gè)主鍵索引,索引和約束同名為PRIMARY,索引關(guān)鍵字是cstid。創(chuàng)建該唯一性約束的同時(shí)還創(chuàng)建了一個(gè)唯一性索引,索引和約束同名為UN_customers2_emailaddress,索引關(guān)鍵字是emailaddress。

2. 修改數(shù)據(jù)表時(shí)添加唯一性約束

如果創(chuàng)建數(shù)據(jù)表時(shí)沒(méi)有指定唯一性約束,可以在修改數(shù)據(jù)表時(shí)設(shè)置唯一性約束。

【例6-31】在圖書銷售數(shù)據(jù)庫(kù)booksale的表books2中,為isbn列設(shè)置唯一性約束。

默認(rèn)的約束名為被約束列名isbn。若books2表的isbn列所有取值均唯一,則唯一性約束可以成功建立,否則將會(huì)創(chuàng)建失敗。

提示/

在修改表時(shí)添加唯一性約束需要注意,由于表中已經(jīng)存在數(shù)據(jù),若設(shè)置唯一性約束的列存在違反實(shí)體完整性的情況,則唯一性約束無(wú)法創(chuàng)建成功。

3. 刪除唯一性約束

一個(gè)表可以含有多個(gè)唯一性約束,對(duì)于已存在的唯一性約束,可以修改或刪除它。若要修改唯一性約束,必須先刪除現(xiàn)有的唯一性約束,然后再重新創(chuàng)建。

【例6-32】在圖書銷售數(shù)據(jù)庫(kù)booksale的表books2中,刪除唯一性約束。

唯一性約束刪除的同時(shí),自動(dòng)生成的唯一性索引也同步刪除。

03、外鍵約束

外鍵約束(FOREIGN KEY)是指用于建立和加強(qiáng)兩個(gè)表之間的連接的一列或多列,即在某一列或多列的組合上定義外鍵約束,這些列值參考某個(gè)表中的主鍵約束列。該約束強(qiáng)制參考完整性。

定義主鍵約束的表稱之為主鍵表或父表,定義外鍵約束的表稱之為外鍵表或子表,外鍵表的被約束列的取值必須是主鍵表的被約束列的值或?yàn)榭铡?/p>

外鍵約束具有以下特點(diǎn)。

● 每個(gè)表可以定義多個(gè)外鍵約束。

● 臨時(shí)表不能創(chuàng)建外鍵約束。

● 外鍵表中被約束的列必須和主鍵表中被約束的列數(shù)據(jù)類型一致、長(zhǎng)度一致。

● 外鍵約束將自動(dòng)創(chuàng)建索引。

● 外鍵約束的主要目的是控制可以存儲(chǔ)在外鍵表中的數(shù)據(jù),但它還可以控制對(duì)主鍵表中數(shù)據(jù)的更改。

● 根據(jù)參照動(dòng)作,可以控件父表數(shù)據(jù)的刪除。

外鍵約束的基本語(yǔ)法格式如下所示。

語(yǔ)法說(shuō)明如下。

●constraint_name是可選選項(xiàng),用于指定約束的名稱。如果用戶沒(méi)有提供約束名稱,系統(tǒng)將會(huì)自動(dòng)生成一個(gè)以表名開(kāi)頭、加上“_ibfk_”以及一個(gè)數(shù)字編號(hào)(1,2,3,…)組成的約束名字。約束名稱大長(zhǎng)度為64個(gè)字符,而且區(qū)分大小寫。

● FOREIGN KEY是定義外鍵約束的命令關(guān)鍵字。

● REFERENCES用于指定該外鍵參考哪個(gè)父表中的哪個(gè)主鍵列或候選鍵列。

● ON DELETE和ON UPDATE選項(xiàng)是通過(guò)使用級(jí)聯(lián)參照完整性約束,定義當(dāng)用戶試圖刪除或更新現(xiàn)有外鍵指向的鍵時(shí),數(shù)據(jù)庫(kù)引擎將執(zhí)行以下操作。

◇ RESTRICT表示拒絕對(duì)父表進(jìn)行刪除或更新操作。

◇ CASCADE表示如果在父表中刪除或更新了一行,則將在引用表中刪除或更新相應(yīng)的行,即級(jí)聯(lián)刪除或級(jí)聯(lián)更新。如果timestamp列是外鍵或被引用鍵的一部分,則不能指定CASCADE。

◇ SET NULL表示如果刪除或更新了父表中的相應(yīng)行,則會(huì)將構(gòu)成外鍵的所有值設(shè)置為NULL。若要執(zhí)行此約束,外鍵列必須可為空值。

◇ NO ACTION與RESTRICT的作用相同,它是標(biāo)準(zhǔn)的SQL關(guān)鍵字。

◇ SET DEFAULT表示如果刪除或更新了父表中的相應(yīng)行,則會(huì)將構(gòu)成外鍵的所有值設(shè)置為它們的默認(rèn)值。若要執(zhí)行此約束,外鍵列必須具有默認(rèn)值定義。如果某個(gè)列可為空值,并且未設(shè)置顯式的默認(rèn)值,則會(huì)使用NULL作為該列的隱式默認(rèn)值。

1. 創(chuàng)建數(shù)據(jù)表時(shí)添加外鍵約束

在創(chuàng)建數(shù)據(jù)表時(shí)可以添加外鍵約束。

【例6-33】在圖書銷售數(shù)據(jù)庫(kù)booksale中創(chuàng)建評(píng)論表comments2,為cstid列添加外鍵約束,該列的取值要參考customers表中的cstid列,為bookid列添加外鍵約束,該列的取值要參考books表中的bookid列,該約束名為FK_books_comments2_bookid,然后查看約束和索引的情況。

注意/

必須先創(chuàng)建父表books,且books表的bookid列是主鍵,再創(chuàng)建子表comments2。

對(duì)外鍵約束來(lái)說(shuō),雖然支持列級(jí)約束的創(chuàng)建語(yǔ)法,但實(shí)際上沒(méi)有效果,因此在cstid列上創(chuàng)建外鍵約束的寫法無(wú)法成功地創(chuàng)建外鍵約束,而在bookid列上創(chuàng)建外鍵約束的寫法可以成功地創(chuàng)建外鍵約束。因此在創(chuàng)建comments2表的同時(shí)創(chuàng)建了一個(gè)外鍵約束,這個(gè)外鍵約束的約束名為指定約束名FK_books_comments2_bookid,約束類型為FOREIGN KEY。

創(chuàng)建該外鍵約束的同時(shí)還創(chuàng)建了一個(gè)索引,索引名同約束名為FK_books_comments2_bookid,索引關(guān)鍵字是bookid。

2. 修改數(shù)據(jù)表時(shí)添加外鍵約束

如果創(chuàng)建數(shù)據(jù)表時(shí)沒(méi)有指定外鍵約束,可以在修改數(shù)據(jù)表時(shí)設(shè)置外鍵約束。如果已經(jīng)創(chuàng)建了外鍵約束,但是沒(méi)有加上級(jí)聯(lián)功能,則需要先將該外鍵約束刪除,然后重新建立外鍵約束時(shí)添加級(jí)聯(lián)功能。

【例6-34】在圖書銷售數(shù)據(jù)庫(kù)booksale的表comments2中,為cstid列添加外鍵約束,該列的取值要參考customers表中的cstid列。如果刪除或更新了customers表中的一條記錄,則 comments2表相關(guān)的記錄也相應(yīng)刪除或更新,然后查看約束和索引的情況。

命令中未指定約束名,因此約束名由系統(tǒng)自動(dòng)生成,名為"comments2_ibfk_1"。創(chuàng)建該外鍵約束的同時(shí)還創(chuàng)建了一個(gè)索引,當(dāng)不指定約束名時(shí)自動(dòng)生成的索引名為外鍵約束的列名cstid,索引關(guān)鍵字是cstid。

3. 刪除外鍵約束

一個(gè)表可以含有多個(gè)外鍵約束,對(duì)于已存在的外鍵約束,可以修改或刪除它。若要修改外鍵約束,必須先刪除現(xiàn)有的外鍵約束,然后再重新創(chuàng)建。

【例6-35】在圖書銷售數(shù)據(jù)庫(kù)booksale的表comments2中,刪除約束名為"comments2_ibfk_1"的外鍵約束。查看約束和索引的情況。

指定的外鍵約束已經(jīng)刪除,但外鍵約束創(chuàng)建時(shí)生成的索引不會(huì)自動(dòng)刪除。

04、默認(rèn)值約束

默認(rèn)值約束(DEFAULT)通過(guò)設(shè)置默認(rèn)值來(lái)強(qiáng)制域完整性。在表中的某個(gè)列上定義了默認(rèn)約束后,當(dāng)插入新的數(shù)據(jù)行時(shí),如果沒(méi)有為該列指定數(shù)據(jù),則系統(tǒng)將默認(rèn)值賦值給該列。

默認(rèn)值約束具有以下特點(diǎn)。

● 表中的每個(gè)列上只能定義一個(gè)默認(rèn)約束。

● 默認(rèn)值只能是常量值和CURRENT_TIMESTAMP(返回當(dāng)前的日期和時(shí)間)。

● 默認(rèn)值不能參照于其他列或其他表的值。

默認(rèn)值約束的基本語(yǔ)法格式如下所示。

語(yǔ)法說(shuō)明如下。

  • SET是可選選項(xiàng),當(dāng)向已有的表中添加默認(rèn)值約束時(shí)使用的命令關(guān)鍵字;新建表中添加默認(rèn)值約束時(shí)不用該關(guān)鍵字。

  • DEFAULT是定義默認(rèn)值約束的命令關(guān)鍵字。

  • constant_expression是默認(rèn)值的常量表達(dá)式。此表達(dá)式若為文本字符串,請(qǐng)用單引號(hào)(‘)將值括起來(lái)。

  • 該約束只能為列級(jí)約束,只需在列定義的后面加上該子句。

1. 創(chuàng)建數(shù)據(jù)表時(shí)添加默認(rèn)值約束

在創(chuàng)建數(shù)據(jù)表時(shí)可以為指定列設(shè)置默認(rèn)值約束。

【例6-36】在圖書銷售數(shù)據(jù)庫(kù)booksale中創(chuàng)建評(píng)論表comments3,為comment列添加一個(gè)默認(rèn)值約束,默認(rèn)值設(shè)為good。

輸入以下數(shù)據(jù)進(jìn)行驗(yàn)證。

第一條語(yǔ)句的comment列輸入的空字符串(' '),所以顯示為空白;第二條語(yǔ)句的comment列沒(méi)有輸入值,但是顯示記錄中該列的值為good,說(shuō)明該記錄自動(dòng)使用了comment列的默認(rèn)值。

【例6-37】在圖書銷售數(shù)據(jù)庫(kù)booksale中創(chuàng)建訂單表orders2,為orderdate列添加一個(gè)默認(rèn)值約束,默認(rèn)值設(shè)為創(chuàng)建時(shí)間。

默認(rèn)值只能是常量值和CURRENT_TIMESTAMP,且CURRENT_TIMESTAMP只適合timestamp數(shù)據(jù)類型。創(chuàng)建orders2表的同時(shí)創(chuàng)建了兩個(gè)默認(rèn)值約束,orderdate列設(shè)置默認(rèn)值為CURRENT_TIMESTAMP,shipdate列設(shè)置默認(rèn)值為空。

輸入以下數(shù)據(jù)進(jìn)行驗(yàn)證。

order2表中,orderdate列顯示當(dāng)前系統(tǒng)日期,而shipdate列為空。

2. 修改數(shù)據(jù)表時(shí)添加默認(rèn)值約束

如果創(chuàng)建數(shù)據(jù)表時(shí)沒(méi)有指定默認(rèn)值約束,可以在修改數(shù)據(jù)表時(shí)設(shè)置默認(rèn)值約束。

【例6-38】在圖書銷售數(shù)據(jù)庫(kù)booksale的表customers表中,為password列添加一個(gè)默認(rèn)值約束,默認(rèn)值設(shè)為“12345678”,然后查看表結(jié)構(gòu)。

3. 刪除默認(rèn)值約束

一個(gè)表可以含有多個(gè)默認(rèn)值約束,對(duì)于已存在的默認(rèn)值約束,可以修改或刪除它。若要修改默認(rèn)值約束,必須先刪除現(xiàn)有的默認(rèn)值約束,然后再重新創(chuàng)建。

【例6-39】在圖書銷售數(shù)據(jù)庫(kù)booksale的表comments3表中,刪除建立在comment列上的默認(rèn)值約束。

05、非空約束

非空約束(NOT NULL)將保證所有記錄中該列都有值。在表中的某列上定義了非空約束后,當(dāng)插入新數(shù)據(jù)行時(shí),如果沒(méi)有為該列指定數(shù)據(jù),則數(shù)據(jù)庫(kù)系統(tǒng)會(huì)報(bào)錯(cuò)。

非空約束具有以下特點(diǎn)。

● 列級(jí)約束,只能使用列級(jí)約束語(yǔ)法定義。

● 確保列值不允許為空。

提示/

所有數(shù)據(jù)類型的值都可以是NULL值;空字符串不等于NULL,0也不等于NULL。

非空約束的基本語(yǔ)法格式如下所示。

語(yǔ)法說(shuō)明如下。

  • NOT NULL是設(shè)置非空約束的命令關(guān)鍵字。

  • 該約束只能為列級(jí)約束,只需在列定義的后面直接添加該關(guān)鍵字,不添加該關(guān)鍵字時(shí)默認(rèn)為NULL。

1. 創(chuàng)建數(shù)據(jù)表時(shí)添加非空約束

在創(chuàng)建數(shù)據(jù)表時(shí)可以為指定列設(shè)置非空約束。

【例6-40】在圖書銷售數(shù)據(jù)庫(kù)booksale中創(chuàng)建圖書類別表categories3,為ctgcode列創(chuàng)建非空約束。

輸入以下數(shù)據(jù)進(jìn)行驗(yàn)證。

插入失敗,提示錯(cuò)誤信息:[Err] 1048-Column 'ctgcode' cannot be null。因?yàn)閏tgcode列的值是NULL,違反了非空約束。

2. 修改數(shù)據(jù)表時(shí)添加非空約束

如果創(chuàng)建數(shù)據(jù)表時(shí)沒(méi)有指定非空約束,可以在修改數(shù)據(jù)表時(shí)設(shè)置非空約束。

【例6-41】在圖書銷售數(shù)據(jù)庫(kù)booksale的表categories3中,為ctgname列創(chuàng)建非空約束。

該方法既可改變列的數(shù)據(jù)類型,又可為列添加非空約束。

3. 刪除非空約束

刪除非空約束的方法其實(shí)就是修改數(shù)據(jù)表,為列設(shè)置屬性NULL。

【例6-42】在圖書銷售數(shù)據(jù)庫(kù)booksale的表categories3中,刪除ctgname列上的非空約束。

06、自增約束

自增約束(AUTO_INCREMENT)是MySQL數(shù)據(jù)庫(kù)中一個(gè)特殊的約束,其主要用于為表中插入的新記錄自動(dòng)生成唯一的ID。

自增約束具有以下特點(diǎn)。

● 一個(gè)表只能有一個(gè)列使用自增約束,且該列必須是主鍵或主鍵的一部分。

● 自增列必須具備NOT NULL屬性。

● 自增約束的列可以是任何整數(shù)類型(TINYINT、SMALLINT、INT、BIGINT等)。

● 默認(rèn)情況下自增列中的第一個(gè)值是1,后續(xù)值自動(dòng)加1。如果用戶設(shè)置了一個(gè)非1的初始值,后續(xù)值將在該值基礎(chǔ)上自動(dòng)加1。

● 自增數(shù)據(jù)列序號(hào)的大值受該列的數(shù)據(jù)類型約束,如TINYINT數(shù)據(jù)列的大編號(hào)是127,若加上UNSIGNED,則大為255。一旦達(dá)到上限,自增就會(huì)失效。

自增約束的基本語(yǔ)法格式如下所示。

語(yǔ)法說(shuō)明如下。

  • AUTO_INCREMENT是設(shè)置自增約束的命令關(guān)鍵字,在列的后面直接添加該關(guān)鍵字。

  • AUTO_INCREMENT=n是可選選項(xiàng),用于設(shè)置自增的初始值,設(shè)置在表結(jié)構(gòu)的外面。省略時(shí)表示從1開(kāi)始自增。

1. 創(chuàng)建數(shù)據(jù)表時(shí)添加自增約束

在創(chuàng)建數(shù)據(jù)表時(shí)可以為主鍵或主鍵的部分列設(shè)置自增約束。

【例6-43】在圖書銷售數(shù)據(jù)庫(kù)booksale中創(chuàng)建評(píng)論表comments4,為cmmid列添加主鍵約束和自增約束,設(shè)置自增的初始值為100。

cmmid列的自動(dòng)增長(zhǎng)值為100、101、102等,以100為起始值間隔為1這樣增長(zhǎng)。

2. 修改數(shù)據(jù)表時(shí)添加自增約束

如果創(chuàng)建數(shù)據(jù)表時(shí)沒(méi)有指定自增約束,可以在修改數(shù)據(jù)表時(shí)設(shè)置自增約束。

【例6-44】在圖書銷售數(shù)據(jù)庫(kù)booksale的表books2中,為bookid列創(chuàng)建自增約束。

前提是bookid列是主鍵或主鍵的一部分。

3. 刪除自增約束

刪除自增約束的方法其實(shí)就是修改數(shù)據(jù)表,去掉AUTO_INCREMENT。

【例6-45】在圖書銷售數(shù)據(jù)庫(kù)booksale的表books2中,刪除bookid列上的自增約束。

07、檢查約束

檢查約束(CHECK)是用來(lái)驗(yàn)證用戶輸入某一列的數(shù)據(jù)的有效性。該約束通過(guò)列中的值來(lái)強(qiáng)制域的完整性,它用來(lái)指定某列可取值的集合或范圍。

檢查約束具有以下特點(diǎn)。

● 每個(gè)表可以定義多個(gè)檢查約束。

● 檢查約束可以參考本表中的其他列。例如:在訂單表orders中,shipdate(發(fā)貨日期)列可以引用orderdate(訂購(gòu)日期)列,使得shipdate列的數(shù)據(jù)大于orderdate列的數(shù)據(jù)。

● 檢查約束不能放在AUTO_INCREMENT屬性的列上或數(shù)據(jù)類型為timestamp的列上,因?yàn)檫@兩種列都是自動(dòng)插入數(shù)據(jù)的。

● 當(dāng)向設(shè)有檢查約束的表中插入記錄或更新記錄時(shí),該記錄中的被約束列的值必須滿足檢查約束條件,否則無(wú)法錄入。

● 可以為列級(jí)完整性約束,也可以為表級(jí)完整性約束。

● 檢查約束在MySQL 8.0.16版本中才實(shí)現(xiàn)了自動(dòng)對(duì)寫入的數(shù)據(jù)進(jìn)行約束檢查。

檢查約束的基本語(yǔ)法格式如下所示。

語(yǔ)法說(shuō)明如下。

  • constraint_name是可選選項(xiàng),用于指定約束的名稱。如果用戶沒(méi)有提供約束名稱,系統(tǒng)將會(huì)自動(dòng)生成一個(gè)以表名開(kāi)頭、加上"_chk_"以及一個(gè)數(shù)字編號(hào)(1,2,3,…)組成的約束名字。約束名稱大長(zhǎng)度為64個(gè)字符,而且區(qū)分大小寫。

  • CHECK是定義檢查約束的命令關(guān)鍵字。

  • expr是一個(gè)布爾表達(dá)式,用于指定約束的條件。表中的每行數(shù)據(jù)都必須滿足expr的結(jié)果為TRUE或UNKNOWN(NULL)。如果表達(dá)式的結(jié)果為FALSE,將會(huì)違反約束。

  • ENFORCED是可選的子句,用于指定是否強(qiáng)制該約束:如果忽略或指定了ENFORCED,創(chuàng)建并強(qiáng)制該約束;如果指定了NOT ENFORCED,創(chuàng)建但是不強(qiáng)制該約束,這也意味著約束不會(huì)生效。

1. 創(chuàng)建數(shù)據(jù)表時(shí)添加檢查約束

在創(chuàng)建數(shù)據(jù)表時(shí)可以添加檢查約束。

【例6-46】在圖書銷售數(shù)據(jù)庫(kù)booksale中創(chuàng)建圖書表books3,其中unitprice列的取值范圍在0~200元,ctgcode列的取值只能是computer和language。

創(chuàng)建books3表的同時(shí)創(chuàng)建了一個(gè)主鍵約束和兩個(gè)檢查約束,unitprice列上的檢查約束是一個(gè)列級(jí)約束,默認(rèn)的約束名為books3_chk_1,約束類型為CHECK;ctgcode列上的檢查約束是一個(gè)表級(jí)約束,默認(rèn)的約束名為books3_chk_2,約束類型為CHECK。

輸入以下數(shù)據(jù)進(jìn)行驗(yàn)證。

數(shù)據(jù)正常插入,再輸入以下數(shù)據(jù)進(jìn)行驗(yàn)證。

插入失敗,提示錯(cuò)誤信息:[Err] 3819-Check constraint 'books3_chk_1' is violated.。因?yàn)閡nitprice列的值249.00不滿足檢查約束的表達(dá)式,違反了檢查約束。

2. 修改數(shù)據(jù)表時(shí)添加檢查約束

如果創(chuàng)建數(shù)據(jù)表時(shí)沒(méi)有指定檢查約束,可以在修改數(shù)據(jù)表時(shí)設(shè)置檢查約束。

【例6-47】在圖書銷售數(shù)據(jù)庫(kù)booksale的表orders2中,約定發(fā)貨日期shipdate要在訂購(gòu)日期orderdate之后,因此為這兩列設(shè)置檢查約束。

若books2表的shipdate列取值均大于或等于orderdate列的取值,則檢查約束可以成功建立,否則將會(huì)創(chuàng)建失敗。

輸入以下數(shù)據(jù)進(jìn)行驗(yàn)證。

數(shù)據(jù)正常插入,再輸入以下數(shù)據(jù)進(jìn)行驗(yàn)證。

插入失敗,提示錯(cuò)誤信息:[Err] 3819 - Check constraint 'orders2_chk_1' is violated.。因?yàn)閟hipdate列的值"2021-04-14"小于orderdate列的值"2021-04-15",不滿足檢查約束的表達(dá)式,違反了檢查約束。

3. 刪除檢查約束

一個(gè)表可以含有多個(gè)檢查約束,對(duì)于已存在的檢查約束,可以修改或刪除它。若要修改檢查約束,必須先刪除現(xiàn)有的檢查約束,然后再重新創(chuàng)建。

【例6-48】在圖書銷售數(shù)據(jù)庫(kù)booksale的表books3中,刪除建立在ctgcode列上的檢查約束。

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧

標(biāo)題名稱:數(shù)據(jù)庫(kù)原理及MySQL應(yīng)用|約束-創(chuàng)新互聯(lián)
當(dāng)前地址:http://muchs.cn/article36/eiisg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信公眾號(hào)、App設(shè)計(jì)網(wǎng)站設(shè)計(jì)公司、企業(yè)網(wǎng)站制作建站公司、品牌網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

小程序開(kāi)發(fā)