官术网_书友最值得收藏!

4.3 使用約束

為了保證數據的完整性,需要使用數據庫約束。約束主要包括唯一約束(UNIQUE)、主鍵約束(PRIMARY KEY)、外鍵約束(FOREIGN KEY)、檢查約束(CHECK)和非空約束(NOT NULL)。這一節將介紹這幾種約束的作用以及它們在創建數據表的過程中是如何定義的。

4.3.1 唯一約束

唯一約束(UNIQUE)用來保證某一列或者一組列中沒有相同的值。如果為列定義了唯一約束,則該列中不允許出現重復的值,但是允許列中存在空值(即NULL值)。唯一約束既可以定義的表級上,也可以定義在列級上。一般在為列創建唯一約束后,數據庫會自動為該列建立一個唯一索引,其索引名與約束名是相同的。

例4.2 創建院系信息表,并為院校編號所在列定義唯一約束。

        CREATE TABLE T_dept (
        deptID   VARCHAR (15) UNIQUE,
        deptName VARCHAR (10)

在這段SQL語句中,使用CREATE TABLE語句院系信息表,并為列deptID定義唯一約束。其中, T_dept是表的名字,這里T_dept表示院系信息表。在T_dept表中,共指定了2個列用來描述院系信息。

?deptID指定數據表的列名,列deptID表示院系編號,VARCHAR (15)用來指定deptID列的數據類型,這里將其指定為VARCHAR類型,并且設定該列中字符串長度為15,UNIQUE用來指定列deptID的完整性約束條件,這里將其定義為唯一約束。

?列deptName表示院系名稱,VARCHAR (10)用來指定deptName列的數據類型,這里將其指定為VARCHAR類型,并且設定該列中字符串長度為10。

選中MySQL 5.0用戶圖形界面的右側Schemata選項下的test_STInfo數據庫中的院系信息表T_dept,單擊鼠標右鍵,在出現的列表中選擇“Edit Tabel”選項,在出現的表編輯對話框中,選擇對話框下方的“Indices”選項卡,可以看到為院系信息表T_dept中列deptID定義的唯一約束信息,如圖4.4所示。

圖4.4 唯一約束信息

在圖4.4中,“Indices”選項卡下描述了對院系信息表T_dept中列deptID定義的唯一約束信息。在“Index Settings”選項下指定了數據表T_dept中唯一約束的信息。其中,“Index Name”指定了索引的名字,“Index Kind”指定了索引的類型為唯一索引,“Index Type”指定了索引類型;在界面的右下方空白處,在Index Columns選項下指定了唯一索引的列名為deptID。

注意 在為列創建唯一約束后,數據庫會為該列建立一個唯一索引,其索引名與約束名是相同的。

4.3.2 主鍵約束

主鍵約束(PRIMARY KEY)是用來保證使用主鍵約束的某一列或者一組列中有唯一的值,并且不能包含空值(即NULL值)。數據表中每一列只能定義一個PRIMARY KEY。一般在為列創建主鍵約束后,數據庫會自動為該列建立一個主索引,其索引名與約束名是相同的。

在創建數據表時,如果希望將多個列組合起來作為一個數據表中的主鍵,可以在PRIMARY KEY關鍵字后使用括號,將需要定義為主鍵的列放到PRIMARY KEY關鍵字后面的括號中。括號中的多個列之間需要使用逗號分隔。

例4.3 創建成績信息表。

        CREATE TABLE T_result(
        stuID VARCHAR (15) ,
        curID VARCHAR (15) ,
        result DOUBLE ,
        PRIMARY KEY (stuID,curID)
        )

在這段SQL語句中,使用CREATE TABLE語句成績信息表,并將列stuID和列curID聯合作為主鍵。其中,T_result是表的名字,這里T_result表示成績信息表。在T_result表中,共指定了3個列用來描述學生的成績信息。

?stuID指定數據表的列名,列stuID表示學生編號,VARCHAR (15)用來指定stuID列的數據類型,這里將其指定為VARCHAR類型,并且設定該列中字符串長度為15。

?curID指定數據表的列名,列curID表示院系編號,VARCHAR (15)用來指定curID列的數據類型,這里將其指定為VARCHAR類型,并且設定該列中字符串長度為15。

?列result表示學生成績,DOUBLE用來指定result列的數據類型,這里將其定義為DOUBLE類型的數據。

?PRIMARY KEY表示主鍵約束,這里將列stuID和列curID聯合作為成績信息表的主鍵。

選中MySQL 5.0用戶圖形界面的右側Schemata選項下test_stinfo數據庫中的成績信息表T_result,單擊鼠標右鍵,在出現的列表中選擇“Edit Tabel”選項,在出現的表編輯對話框中,選擇對話框下方的“Indices”選項卡,可以看到為成績信息表T_result中列stuID和列curID定義的主鍵約束信息,如圖4.5所示。

圖4.5 主鍵約束信息

在圖4.5中,在表編輯對話框的上方,從“Columns and Indices”選項卡下的表格中可以看到列stuID和列curID前面都有一個的圖標,圖標表示列stuID和列curID為成績信息表T_result的主鍵列。

“Indices”選項卡下方描述了對成績信息表T_result中列stuID和列curID定義的主鍵約束信息。其中,在表編輯對話框的左下方的空白處有一個PRIMARY關鍵字,在界面的右下方空白處,在Index Columns選項下指定了PRIMARY關鍵字對應的主鍵為列stuID和列curID。

注意 在為列創建主鍵約束后,數據庫會為該列建立一個主索引,其索引名與約束名是相同的。

4.3.3 外鍵約束

首先來考慮這樣一個問題,現在由于某種原因需要將一名學生在學校的全部信息刪除。這里涉及學生信息的一共有兩個表,一個是學生信息表,一個是成績信息表。學生信息表保存的是學生的基本信息,成績信息表保存的是學生選課的課程成績信息。如果沒有定義外鍵約束,將該名學生從學生信息表中刪除時,而沒有將該名學生的選課的課程成績信息刪除,這樣就會造成兩個關聯表之間數據的不一致。

同樣的問題也可能出現在對兩個關聯表中數據的修改操作中。如果是多個表之間存在關聯關系的話,不定義外鍵約束,類似上面的情況很可能會發生。為了避免由于操作不當而引起的關聯表中數據的不一致,有必要為關聯表之間定義外鍵約束。

外鍵約束(FOREIGN KEY)主要是用來定義兩個表之間的關系。外鍵約束保證了表的參照完整性,確保對一個表的數據操作不會對與之關聯的表造成不利的影響。定義外鍵的語法格式如下:

        FOREIGN KEY[表名1](列名1) REFERENCES 表名2(列名2)
        [ON UPDATE [CASCADE]|[SET NULL]|[RESTRICT]]
        [ON DELETE[CASCADE]|[SET NULL]|[RESTRICT]]

其中,FOREIGN KEY是定義外鍵的關鍵字;表名1表示從表的名字,它是可選的;列名1指定數據表中用于外鍵約束條件的外鍵;REFERENCES關鍵字用來指定主表中的表名和主表中的關鍵列;表名2表示主表的名字;列名2表示主表中與從表列名1對應的主鍵列的名字;其后的ON UPDATE和ON DELETE分別指明了在對表中的數據做修改和刪除時,主從表之間所要采取的主要的操作方式,它們是可選的。下面以刪除操作為列,分別講解一下這3種操作方式。

?CASCADE:級聯刪除。如果主表中的一條數據記錄被刪除,那么從表中與之相對應的數據也將被一起刪除。

?SET NULL:置空刪除。如果主表中的一條數據記錄被刪除,那么從表中與之相對應的數據也將被設置為空值。

?RESTRICT:受限刪除。如果主表中的一條數據記錄被刪除,則在執行DELETE命令時數據庫管理系統會報錯,通知用戶與主表相對應的該數據在從表中仍然存在,但是與主表相對應的該數據在從表中不會被刪除。它是默認的方式。

例4.4 為成績信息表定義外鍵。

        CREATE TABLE T_result(
        stuID   VARCHAR (15) ,
        curID   VARCHAR (15) ,
        result   DOUBLE ,
        FOREIGN KEY(stuID) REFERENCES T_student(stuID) ON DELETE CASCADE,
        PRIMARY KEY (stuID,curID)
        )

這段SQL語句在例4.3的基礎上,增加了一個創建外鍵的語句FOREIGN KEY(stuID) REFERENCES T_student(stuID)。其中,FOREIGN KEY表示創建外鍵約束的關鍵字;stuID表示為成績信息表(T_result)中的表示學生編號的列stuID定義外鍵約束;REFERENCES T_student(stuID)表示將列stuID定義為一個指向學生信息表T_student的主鍵stuID中的外鍵,并使用ON DELETE CASCADE定義了其刪除方式為級聯刪除。

選中MySQL 5.0用戶圖形界面的右側Schemata選項下的test_STInfo數據庫中的成績信息表T_result,單擊鼠標右鍵,在出現的列表中選擇“Edit Tabel”選項,在出現的表編輯對話框中,選擇對話框下方的“Foreign Keys”選項卡,可以看到為成績信息表T_result中列stuID定義的外鍵約束信息,如圖4.6所示。

圖4.6 外鍵約束

在圖4.6中,“Foreign Key Settings”選項下描述了對數據表T_result中列stuID定義的外鍵約束信息。其中,“Key Name”表示主鍵的名字;“Ref.Table”指定了表T_result對應的主表,這里表T_result對應的主表為T_student(學生信息表);On Delete指定了數據刪除方式,這里的刪除方式指定為Cascade(級聯刪除);On Update指定了數據修改方式,這里的修改方式默認指定為Restrict(受限修改)。

注意 在定義外鍵約束時,其默認的修改和刪除方式都是RESTRICT。由于例4.4的SQL語句指定了列stuID的刪除方式為CASCADE(級聯刪除),而沒有指定列stuID的修改方式,因此,數據庫中就使用其默認的修改方式RESTRICT。

下面請讀者思考一下,如果想在列curID中也定義一個指向課程信息表T_curriculum的主鍵curID中的外鍵約束,并將其刪除方式定義為級聯刪除,那么上述的SQL語句應該如何完成呢?

4.3.4 檢查約束

檢查約束(CHECK)是用來限制列的取值范圍或者取值條件,使用CHECK約束可以保證數據規則的一致性。可以為一個列定義多個CHECK約束,當為列定義了CHECK約束后,該列中所對應的數據必須滿足指定的約束條件。

例4.5 定義課程信息表。

        CREATE TABLE T_curriculum(
        curID VARCHAR (15) PRIMARY KEY,
        curName VARCHAR (10),
        credit INT,
        CHECK(credit BETWEEN 3 AND 8)
        )

在這段SQL語句中,使用CREATE TABLE語句創建課程信息表,并使用CHECK關鍵字對列credit的取值范圍進行約束。其中,T_curriculum是表的名字,這里T_curriculum表示課程信息表。在T_curriculum表中,共指定了3個列用來描述課程信息。

?curID指定數據表的列名,列curID表示院系編號,VARCHAR (15)用來指定curID列的數據類型,這里將其指定為VARCHAR類型,并且設定該列中字符串長度為15。并使用PRIMARY KEY關鍵字將該列定義為主鍵列。

?curName指定數據表的列名,列curName表示課程的名字,VARCHAR (10)用來指定curName列的數據類型,這里將其指定為VARCHAR類型,并且設定該列中字符串長度為10。

?列credit表示課程學分,INT用來指定credit列的數據類型,這里將課程學分所在的列定義為整型類型的數據。

?使用CHECK關鍵字對表示課程學分的列credit的取值范圍進行約束。這里將課程學分的取值范圍設置在3到8之間。如果插入的數據小于3或者大于8,則SQL語句執行時會顯示錯誤的信息。

4.3.5 非空約束

非空約束(NOT NULL)是用來保證在向該列插入數據時不允許插入空值(即NULL值)。非空約束只能用來約束列。

例4.6 創建教師信息表。

        CREATE TABLE T_teacher (
        teaID   VARCHAR (15) PRIMARY KEY,
        teaName VARCHAR (10)   NOT NULL,
        age   INT   NOT NULL,
        sex   VARCHAR (2) NOT NULL,
        deptID VARCHAR (15),
        dept VARCHAR (20)   NOT NULL,
        profession VARCHAR (10)
        )

這段SQL語句是使用CREATE TABLE創建一張教師信息表。其中,T_teacher表示創建數據表的表名,在T_teacher表中,共指定了7個列用來描述教師信息。

?teaID指定數據表的列名,列teaID用來表示教師編號;VARCHAR (15)用來指定teaID列的數據類型,這里將其指定為VARCHAR類型,并且設定該列中字符串長度為15;PRIMARY KEY用來指定列teaID的完整性約束條件,這里將列teaID設定為主鍵,表示列teaID的值唯一并且不能為空值(NULL值)。

?teaName指定數據表的列名,列teaName用來表示教師姓名;VARCHAR (10)用來指定teaName列的數據類型,這里將其指定為VARCHAR類型,并且設定該列中字符串長度為10;NOT NULL用來指定列teaName的完整性約束條件,這里將列teaName設定為非空,表示該列中不允許存在空值(NULL值)。

?age指定數據表的列名,列age用來表示教師年齡;INT用來指定age列的數據類型,這里將其指定為INT類型,表示教師的年齡存儲在數據庫中都應該是整數;NOT NULL用來指定列age的完整性約束條件,這里將列age設定為非空,表示該列中不允許存在空值(NULL值)。

?sex指定數據表的列名,列sex用來表示教師性別;VARCHAR (2)用來指定sex列的數據類型,這里將其指定為VARCHAR類型,并且設定該列中字符串長度為2;NOT NULL用來指定列sex的完整性約束條件,這里將列sex設定為非空,表示該列中不允許存在空值(NULL值)。

?deptID指定數據表的列名,列deptID用來表示教師所在的院系編號;VARCHAR (15)用來指定deptID列的數據類型,這里將其指定為VARCHAR類型,并且設定該列中字符串長度為15。

?dept指定數據表的列名,列dept用來表示教師所在的院系;VARCHAR (20)用來指定dept列的數據類型,這里將其指定為VARCHAR類型,并且設定該列中字符串長度為20;NOT NULL用來指定列dept的完整性約束條件,這里將列dept設定為非空,表示該列中不允許存在空值(NULL值)。

?profession指定數據表的列名,列profession用來表示教師的職稱;VARCHAR (10)用來指定profession列的數據類型,這里將其指定為VARCHAR類型,并且設定該列中字符串長度為10。

在創建的教師信息表(T_teacher)中,表示教師姓名的列teaName、表示教師年齡的列age、表示教師性別的列sex和表示教師所在院系的列dept都定義為NOT NULL類型的,也就是這幾個列在數據插入時不允許插入空值。

主站蜘蛛池模板: 凤山市| 衡水市| 隆德县| 梧州市| 山阴县| 乐业县| 曲沃县| 萨迦县| 大厂| 成安县| 若羌县| 闽侯县| 靖西县| 英吉沙县| 潜江市| 昔阳县| 长兴县| 军事| 昌图县| 孟连| 积石山| 塔城市| 昌乐县| 沁源县| 织金县| 梁平县| 广水市| 越西县| 鞍山市| 尉氏县| 纳雍县| 司法| 浦东新区| 怀化市| 汨罗市| 马山县| 阿拉尔市| 精河县| 曲松县| 新邵县| 广平县|