bl双性强迫侵犯h_国产在线观看人成激情视频_蜜芽188_被诱拐的少孩全彩啪啪漫画

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

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

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

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

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

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

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

提示/

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

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

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

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

01、主鍵約束

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

主鍵約束具有以下特點。

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

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

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

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

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

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

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

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

語法說明如下。

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

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

提示/

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

提示/

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

3. 刪除主鍵約束

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

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

主鍵約束刪除的同時,自動生成的主鍵索引也同步刪除。

02、唯一性約束

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

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

唯一性約束具有以下特點。

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

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

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

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

提示/

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

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

語法說明如下。

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

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

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

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

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

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

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

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

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

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

插入失敗,提示錯誤信息:

因為ctgcode的值'computer'是重復(fù)的,違反了唯一性約束。

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

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

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

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

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

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

提示/

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

3. 刪除唯一性約束

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

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

唯一性約束刪除的同時,自動生成的唯一性索引也同步刪除。

03、外鍵約束

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

定義主鍵約束的表稱之為主鍵表或父表,定義外鍵約束的表稱之為外鍵表或子表,外鍵表的被約束列的取值必須是主鍵表的被約束列的值或為空。

外鍵約束具有以下特點。

● 每個表可以定義多個外鍵約束。

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

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

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

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

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

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

語法說明如下。

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

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

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

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

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

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

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

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

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

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

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

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

注意/

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

對外鍵約束來說,雖然支持列級約束的創(chuàng)建語法,但實際上沒有效果,因此在cstid列上創(chuàng)建外鍵約束的寫法無法成功地創(chuàng)建外鍵約束,而在bookid列上創(chuàng)建外鍵約束的寫法可以成功地創(chuàng)建外鍵約束。因此在創(chuàng)建comments2表的同時創(chuàng)建了一個外鍵約束,這個外鍵約束的約束名為指定約束名FK_books_comments2_bookid,約束類型為FOREIGN KEY。

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

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

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

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

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

3. 刪除外鍵約束

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

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

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

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

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

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

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

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

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

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

語法說明如下。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

05、非空約束

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

非空約束具有以下特點。

● 列級約束,只能使用列級約束語法定義。

● 確保列值不允許為空。

提示/

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

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

語法說明如下。

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

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

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

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

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

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

插入失敗,提示錯誤信息:[Err] 1048-Column 'ctgcode' cannot be null。因為ctgcode列的值是NULL,違反了非空約束。

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

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

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

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

3. 刪除非空約束

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

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

06、自增約束

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

自增約束具有以下特點。

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

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

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

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

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

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

語法說明如下。

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

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

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

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

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

cmmid列的自動增長值為100、101、102等,以100為起始值間隔為1這樣增長。

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

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

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

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

3. 刪除自增約束

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

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

07、檢查約束

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

檢查約束具有以下特點。

● 每個表可以定義多個檢查約束。

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

● 檢查約束不能放在AUTO_INCREMENT屬性的列上或數(shù)據(jù)類型為timestamp的列上,因為這兩種列都是自動插入數(shù)據(jù)的。

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

● 可以為列級完整性約束,也可以為表級完整性約束。

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

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

語法說明如下。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

3. 刪除檢查約束

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

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

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

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

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

廣告

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

小程序開發(fā)