最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL學(xué)習(xí)之完整性約束詳解

 更新時(shí)間:2022年08月11日 08:22:48   作者:遇安.112  
數(shù)據(jù)完整性指的是數(shù)據(jù)的一致性和正確性。完整性約束是指數(shù)據(jù)庫(kù)的內(nèi)容必須隨時(shí)遵守的規(guī)則。本文就來(lái)為大家講講MySQL中的完整性約束,需要的可以參考一下

數(shù)據(jù)完整性指的是數(shù)據(jù)的一致性和正確性。完整性約束是指數(shù)據(jù)庫(kù)的內(nèi)容必須隨時(shí)遵守的規(guī)則。若定義了數(shù)據(jù)完整性約束,MySQL會(huì)負(fù)責(zé)數(shù)據(jù)的完整性,每次更新數(shù)據(jù)時(shí),MySQL都會(huì)測(cè)試新的數(shù)據(jù)內(nèi)容是否符合相關(guān)的完整性約束條件,只有符合完整性的約束條件的更新才被接受。

1、主鍵約束

主鍵就是表中的一列或多個(gè)列的組合,其值能唯一地標(biāo)識(shí)表中的每一行。MySQL為主鍵列創(chuàng)建唯一性索引,實(shí)現(xiàn)數(shù)據(jù)的唯一性。在查詢中使用主鍵時(shí),該索引可用來(lái)對(duì)數(shù)據(jù)進(jìn)行快速訪問(wèn)。通過(guò)定義PRIMARY KEY約束來(lái)創(chuàng)建主鍵,而且PRIMARY KEY約束中的列不能取空值。如果PRIMARY KEY約束是由多列組合定義的,則某一列的值可以重復(fù),但PRIMARY KEY約束定義中所有列的組合值必須是唯一的。

可以使用兩種方式定義主鍵來(lái)作為列或表的完整性約束。作為列的完整性約束時(shí),只需在列定義的時(shí)候加上關(guān)鍵字PRIMARY KEY。作為表的完整性約束時(shí),需要在語(yǔ)句最后加上一條PRIMARY KEY(col_name,...)語(yǔ)句。

例:創(chuàng)建表book_copy,將書名定義為主鍵

CREATE TABLE book_copy
(圖書編號(hào) varchar(6) NULL,
書名 varchar(20) NOT NULL PRIMARY KEY,
出版日期 date
);

當(dāng)表中的主鍵為復(fù)合主鍵時(shí),只能定義為表的完整性約束。

創(chuàng)建course表來(lái)記錄每門課程的學(xué)生學(xué)號(hào)、姓名、課程號(hào)和學(xué)分。其中學(xué)號(hào)、課程號(hào)構(gòu)成復(fù)合主鍵

CREATE TABLE course
(學(xué)號(hào) varchar(6) NOT NULL,
姓名 varchar(8) NOT NULL,
課程號(hào) varchar(3),
學(xué)分 tinyint,
PRIMARY KEY(學(xué)號(hào),課程名)
);

原則上,任何列或者列的組合都可以充當(dāng)一個(gè)主鍵。但是主鍵列必須遵守一些規(guī)則:

1、每個(gè)表只能定義一個(gè)主鍵。關(guān)系模型理論要求必須為每個(gè)表定義一個(gè)主鍵。然而,MySQL并不要求這樣,即可以創(chuàng)建一個(gè)沒(méi)有主鍵的表。但是,從安全角度應(yīng)該為每個(gè)基本表指定一個(gè)主鍵。主要原因在于,沒(méi)有主鍵,可能在一個(gè)表中存儲(chǔ)兩個(gè)相同的行。當(dāng)兩個(gè)行不能彼此區(qū)分時(shí),在查詢過(guò)程中,它們將會(huì)滿足同樣的條件,更新的時(shí)候也總是一起更新,容易造成數(shù)據(jù)庫(kù)奔潰。

2、表中兩個(gè)不同的行在主鍵上不能具有相同的值,這就是唯一性規(guī)則。

3、如果從一個(gè)復(fù)合主鍵中刪除一列后,剩下的列構(gòu)成主鍵仍然滿足唯一性原則,那么,該復(fù)合主鍵是不正確的,這條規(guī)則稱為最小化規(guī)則。也就是說(shuō),復(fù)合主鍵不應(yīng)該包含不必要的列。

4、一個(gè)列名在一個(gè)主鍵的列表中只能出現(xiàn)一次。

MySQL自動(dòng)地為主鍵創(chuàng)建一個(gè)索引。通常,這個(gè)索引名為PRIIMARY。不過(guò),也可以重新給改索引另起名。

例:創(chuàng)建course表來(lái)記錄每門課程的學(xué)生學(xué)號(hào)、姓名、課程號(hào)和學(xué)分。其中學(xué)號(hào)、課程號(hào)構(gòu)成復(fù)合主鍵,將主鍵創(chuàng)建的索引命名為INDEX_C

CREATE TABLE course
(學(xué)號(hào) varchar(6) NOT NULL,
姓名 varchar(8) NOT NULL,
課程號(hào) varchar(3),
學(xué)分 tinyint,
PRIMARY KEY INDEX_C(學(xué)號(hào),課程名)
);

2、替代鍵約束

替代鍵像主鍵一樣,是表的一列或一組列,他們的值在任何時(shí)候都是唯一的。替代鍵是沒(méi)有被選做主鍵的候選鍵。定義替代鍵的關(guān)鍵字是UNIQUE

例:在表book中將圖書編號(hào)作為主鍵,書名列定義為一個(gè)替代鍵。 

CREATE TABLE book
(
圖書編號(hào) varchar(20) NOT NULL,
書名 varchar(20) NOT NULL UNIQUE,
PRIMARY KEY(圖書編號(hào))
); 

在MySQL中替代鍵和主鍵的區(qū)別主要有以下幾點(diǎn):

1、一個(gè)數(shù)據(jù)表只能創(chuàng)建一個(gè)主鍵。但一個(gè)表可以有若干個(gè)UNIQUE鍵,并且他們甚至可以重合,例如,在C1和C2列上定義了一個(gè)替代鍵,并且在C2和C3列上定義了另一個(gè)替代鍵,這兩個(gè)替代鍵在C2列上重合了,這是MySQL允許的。

2、主鍵字段的值不允許為NULL,而UNIQUE 字段的值可以是NULL,但必須使用NULL或NOT NULL聲明。

3、創(chuàng)建PRIMARY KEY約束時(shí),系統(tǒng)自動(dòng)產(chǎn)生PRIMARY KEY索引。創(chuàng)建UNIQUE約束時(shí),系統(tǒng)自動(dòng)產(chǎn)生UNIQUE索引。

3、參照完整性約束

只有圖書目錄表中有的圖書才可以銷售,因此,在Sell表中的所有圖書必須是Book表有的圖書,也就是說(shuō)存儲(chǔ)在Sell表中的所有圖書編號(hào)必須存在于Book表的圖書編號(hào)列中。同樣Sell表中的所有身份證號(hào)也必須出現(xiàn)在Members表的身份證號(hào)列中。這種類型的關(guān)系就是參照完整性約束。參照完整性約束都是一種特殊的完整性約束,實(shí)現(xiàn)為一個(gè)外鍵。所以Sell表中的圖書編號(hào)列和身份證號(hào)列都可以定義為一個(gè)外鍵??梢栽趧?chuàng)建表或修改表時(shí)定義一個(gè)外鍵聲明

定義外鍵的語(yǔ)法格式:REFERENCES 表名 [ ( 列名 | (長(zhǎng)度)] [ ASC | DESC ],...) ]

[ON DELETE { RESTRICT | CASCADE | SET NULL | NO ACTION } ]

[ON UPDATE { RESTRICT | CASCADE | SET NULL | NO ACTION } ]

外鍵被定義為表的完整性約束,語(yǔ)法中包含了外鍵所參照的表和列,還可以聲明參照動(dòng)作。如果沒(méi)有指定動(dòng)作,兩個(gè)參照動(dòng)作就會(huì)默認(rèn)地使用RESTRICT。

MySQL參照完整性約束目前只可以用在那些使用InnoDB存儲(chǔ)引擎創(chuàng)建的表中,對(duì)于其他類型的表,MySQL服務(wù)器能夠解析CREATE TABLE語(yǔ)句中的FOREIGN KEY語(yǔ)法,但不能使用或保存它。

要修改表的存儲(chǔ)引擎,可以采用ALTER TABLE語(yǔ)句。例如,修改Book表的存儲(chǔ)引擎為InnoDB,使用:ALTER TABLE book ENGINE=INNODB;

例:創(chuàng)建book_ref表,所有的book_ref表中圖書編號(hào)都必須出現(xiàn)在Book表中,假設(shè)已經(jīng)使用圖書編號(hào)列作為Book表主鍵。

CREATE TABLE book_ref
(
圖書編號(hào) varchar(20) null,
書名 varchar(20) null,
出版日期 date null,
PRIMARY KEY(書名),
FOREIGN KEY(圖書編號(hào))
REFERENCES Book(圖書編號(hào))
ON DELETE RESTRICT
ON UPDATE RESTRICT
)ENGINE=INNODB;

當(dāng)指定一個(gè)外鍵時(shí),適用以下規(guī)則:

1、被參照表必須已經(jīng)用1條CREATE TABLE語(yǔ)句創(chuàng)建了,或者必須是當(dāng)前正在創(chuàng)建的表。在后一種情況下,參照表是同一個(gè)表。

2、必須為被參照表定義主鍵

3、必須在被參照表的表名后面指定列名(或列名的組合)。該列(或該列組合)必須是這個(gè)表的主鍵或替代鍵。

4、盡管主鍵不能夠包含空值,但允許在外鍵中出現(xiàn)一個(gè)空值。這意味著,只要外鍵的每個(gè)非空值出現(xiàn)在指定的主鍵中,該外鍵的內(nèi)容就是正確的。

5、外鍵中列的數(shù)目必須和被參照表的主鍵列的數(shù)目相同

6、外中列的數(shù)據(jù)類型必須和被參照表的主鍵中列的數(shù)據(jù)類型相同

例:創(chuàng)建帶有參照動(dòng)作CASCADE的book_refl表 

CREATE TABLE book_refl
(
圖書編號(hào) varchar(20) null,
書名 varchar(20) not null,
出版日期 date null,
PRIMARY KEY(書名),
FOREIGN KEY(圖書編號(hào))
REFERENCES Book(圖書編號(hào))
ON UPDATE CASCADE
)ENGINE=INNODB;

4、CHECK完整性約束

主鍵、替代鍵和外鍵都是常見的完整性約束的例子。但是,每個(gè)數(shù)據(jù)庫(kù)都還有一些專用的完整性約束。例如,Sell表中訂購(gòu)冊(cè)數(shù)要在1~5000之間,Book表中出版時(shí)間必須大于1986年1月1日。這樣的規(guī)則可以使用CHECK完整性約束來(lái)指定。

CHECK完整性約束在創(chuàng)建表的時(shí)候定義。可以定義為列完整性約束,也可以定義為表完整性約束。

語(yǔ)法格式:CHECK(表達(dá)式)

例:創(chuàng)建表student,只考慮學(xué)號(hào)和性別兩列,性別只能包含男或女 

CREATE TABLE student
(
學(xué)號(hào) char(6) not null,
性別 char(2) not null,
CHECK(性別 IN('男','女'))
);

例:創(chuàng)建表student,只考慮學(xué)號(hào)和出生日期兩列,出生日期必須大于1980年1月1日

CREATE TABLE student
(
學(xué)號(hào) char(6) not null,
出生日期 date not null
CHECK(出生日期>'1980-01-01')
);

到此這篇關(guān)于MySQL學(xué)習(xí)之完整性約束詳解的文章就介紹到這了,更多相關(guān)MySQL完整性約束內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • MySQL8.0 MGR的維護(hù)管理

    MySQL8.0 MGR的維護(hù)管理

    數(shù)據(jù)庫(kù)已成為企業(yè)和管理員們最為關(guān)注的核心組件之一,本文主要介紹了MySQL8.0 MGR的維護(hù)管理,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-08-08
  • MySQL數(shù)據(jù)庫(kù)中的嵌套查詢實(shí)例詳解

    MySQL數(shù)據(jù)庫(kù)中的嵌套查詢實(shí)例詳解

    這篇文章主要給大家介紹了關(guān)于MySQL數(shù)據(jù)庫(kù)中嵌套查詢的相關(guān)資料,嵌套查詢是SQL中的一種技術(shù),允許在一個(gè)查詢語(yǔ)句的某個(gè)部分嵌入另一個(gè)查詢,它主要用于處理復(fù)雜的邏輯,如多層條件過(guò)濾和數(shù)據(jù)對(duì)比,需要的朋友可以參考下
    2024-12-12
  • MySQL COUNT(*)性能原理詳解

    MySQL COUNT(*)性能原理詳解

    這篇文章主要介紹了MySQL COUNT(*)性能原理詳解,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-08-08
  • mysql如何能有效防止刪庫(kù)跑路

    mysql如何能有效防止刪庫(kù)跑路

    本文主要介紹了mysql如何能有效防止刪庫(kù)跑路,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • MySQL判斷空值的三種方法

    MySQL判斷空值的三種方法

    在創(chuàng)建表時(shí),可以指定的列是否可以不包含值,如果在一個(gè)列不包含值,則其稱其為空值NULL,NULL一個(gè)特殊值,代表缺失的值或者不適用的情況,表示未知數(shù)據(jù),本文給大家介紹了MySQL判斷空值的三種方法,需要的朋友可以參考下
    2024-03-03
  • Mysql中的超時(shí)時(shí)間設(shè)置方式

    Mysql中的超時(shí)時(shí)間設(shè)置方式

    這篇文章主要介紹了Mysql中的超時(shí)時(shí)間設(shè)置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • MySQL中的主鍵自增機(jī)制詳情

    MySQL中的主鍵自增機(jī)制詳情

    這篇文章主要介紹了MySQL中的主鍵自增機(jī)制詳情,MySQL提供了主鍵自增機(jī)制AUTO_INCREMENT.?對(duì)主鍵使用,?保證了主鍵的唯一性,下文詳細(xì)介紹需要的小伙伴可以參考一下
    2022-08-08
  • MySQL存儲(chǔ)過(guò)程參數(shù)的用法及說(shuō)明

    MySQL存儲(chǔ)過(guò)程參數(shù)的用法及說(shuō)明

    這篇文章主要介紹了MySQL存儲(chǔ)過(guò)程參數(shù)的用法及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • MySQL?到Oracle?實(shí)時(shí)數(shù)據(jù)同步

    MySQL?到Oracle?實(shí)時(shí)數(shù)據(jù)同步

    這篇文章主要介紹了MySQL?到Oracle?實(shí)時(shí)數(shù)據(jù)同步,本次?MySQL?數(shù)據(jù)實(shí)時(shí)同步到?Oracle大概只花了幾分鐘就完成。使用的工具是Tapdata?Cloud?,這個(gè)工具是永久免費(fèi)的,需要的朋友可以參考一下
    2022-01-01
  • MySQL大內(nèi)存配置方案 如my-medium.ini、my-huge.ini等

    MySQL大內(nèi)存配置方案 如my-medium.ini、my-huge.ini等

    這篇文章主要介紹了MySQL大內(nèi)存配置方案 如my-medium.ini、my-huge.ini等,經(jīng)測(cè)試確實(shí)不錯(cuò),訪問(wèn)mysql速度快了很多
    2014-08-08

最新評(píng)論

石泉县| 林甸县| 洪江市| 黄冈市| 铁岭县| 南乐县| 乌鲁木齐县| 丹阳市| 商南县| 赫章县| 玛沁县| 温州市| 黄陵县| 武宣县| 仁怀市| 丘北县| 都兰县| 济源市| 西林县| 交城县| 广西| 昌平区| 文安县| 娄烦县| 民和| 巴楚县| 富源县| 安徽省| 乌苏市| 漳平市| 丰宁| 余庆县| 阿拉善右旗| 淮安市| 灵璧县| 内江市| 浮梁县| 华宁县| 清苑县| 雷州市| 屯门区|