數據表的創建與更新 數據表是關系數據庫中操作的級別對象。在關系數據庫中,通過數據表來存儲數據記錄。在數據表中會經常用到主鍵、外鍵、約束和索引。這一章將對數據表中涉及到的數據類型以及主鍵、外鍵、約束和索引等概念和使用方法做一個全面的介紹。另外還將介紹數據表的創建方法,以及如何對表中的記錄進行增加和修改操作、如何刪除數據表等內容。 1.數據庫中的表 在關系數據庫中,數據表是存儲數據的基本單元,由行和列兩部分組成的。它是根據數據庫設計階段的E-R圖轉換而來。在數據表中除了行、列、數據記錄、屬性、字段等基本概念外,還會涉及到主鍵、外鍵、索引、約束等概念。 數據記錄、行、字段、列 在關系數據庫中,數據表是存儲數據的基本單元,由行和列兩部分組成的。其中,行用來描述實體中的具體數據,在數據表中每一行中的數據被稱為一條數據記錄,也可以簡稱為記錄;字段是表中的一列,用來保存數據表中某一條記錄中的特定信息。字段在關系數據庫中也可以稱為列。 主鍵 為了保證在一張數據表中不會出現兩個完全相同的數據記錄,需要為每一張數據表都定義一個主鍵。主鍵作為數據表中的唯一標示,保證了一條記錄的唯一性。通過主鍵可以區分數據表中的每一條記錄。在創建數據表時,需要保證被定義為主鍵的列的列值唯一,並且不能為空值(即NULL值)。 主鍵在關系模型中用來約束實體完整性。所謂實體完整性約束是指對數據表中行的完整性約束。在實體完整性中,需要有一個主鍵來唯一標示數據表中每一行的數據記錄,數據表中的主鍵唯一且不能為空值。 注意:主鍵可以定義在多個列上,並不一定只定義在一個列上。也就是說,在定義數據表的時候,可以將數據表中的多個列合並在一起作為該表的主鍵。 外鍵 外鍵是用來定義表與表之間的關系的。在數據表中,外鍵是這樣定義的:如果屬性列F是關系B中一個屬性(並不是關系B的主鍵),並且屬性列F是關系A中的主鍵,則F就是關系B的外鍵。關系A中的表被稱為主表,關系B中的表被稱為主表的從表。 外鍵在關系模型中用來約束參照完整性。所謂參照完整性約束是指表與表之間的約束。在參照完整性中,從表中的每一條數據記錄中的外鍵值都必須存在於主表中。對於建立了關聯關系的兩個數據表來說,對其中一個數據表的增加、修改或者刪除數據的操作都會對另一個數據表中的記錄產生影響。 索引 在實際應用中,為了加快訪問速度,節省訪問時間,一般都需要使用索引進行查詢。通過建立索引,在查詢數據表中的數據時,數據庫可以很快的將其找到,而不用掃描整個數據表。 索引是一個指向數據表中數據的指針,指向索引字段在數據表中的物理位置。如果在執行查詢操作時,WHERE子句中指定的字段是被設置為索引的字段,則數據庫會首先在索引中對指定的值進行查詢,並返回查詢的數據在數據表中的位置。如果在執行查詢操作時,WHERE子句中指定的字段沒有設置為索引的字段,那麼數據庫會查詢數據表中的每一行數據記錄,進行全部掃描。因此適當的創建索引,可以加快數據的檢索速度,提高對數據的訪問效率,提供數據查詢的性能。 當然,索引本身也有一些弊端,例如,索引會占用大量的硬盤空間;隨著數據列的增加,創建和維護索引的時間也會隨之增加;在對數據進行增加、刪除和修改等更新操作的時候,需要對索引進行維護,降低更新數據的速度。因此,對那些不是在查詢過程中經常用到的列以及在數據表中經常需要進行增加、刪除和修改等更新操作的列就不適合建立索引。 雖然創建索引可以提高查詢的速度,但是由於索引本身會占用物理空間以及維護索引可能帶來的時間的損耗,所以在為數據表中的列創建索引時,並不是為數據表中的每一個列都要創建索引,那樣做反而不會起到提高查詢效率的作用。因此需要在數據表的適當的列上創建索引。一般可以在下面這些列中創建索引。 1.在主鍵列中創建索引 2.多表連接時,在經常使用的連接列上創建索引 3.在經常使用WHERE子句查詢的列上創建索引 4.在經常進行分組(GROUP BY)和排序(OREDR BY)的列上創建索引 約束 為了保證數據的完整性,需要使用數據庫約束。完整性約束包括對表的約束和對列的約束。表約束主要包括唯一約束、主鍵約束、外鍵約束和CHECK約束,列約束除了包括唯一約束、參照約束和CHECK約束之外,還有非空約束 唯一約束(UNIQUE):保證使用唯一約束的某一列或者一組列中沒有相同的值,即保證列的值的唯一性。但是唯一約束中可以允許在列中插入空值(即NULL值)。 主鍵約束(PRIMARY KEY):保證使用主鍵約束的列中只能有唯一的值,並且不能包含空值。數據表中每一列只能定義一個PRIMARY KEY。 外鍵約束(FOERING KEY):保證表的參照完整性,確保對一個表的數據操作不會對與之關聯的表造成不利的影響。 檢查約束(CHECK):限制列的取值范圍或者取值條件。可以為一個列定義多個CHECK約束。 非空約束(NOT NULL):只用來約束列。在向該列插入數據時不允許插入空值。 2.創建數據表 在創建完數據庫之後,就可以在數據庫中創建數據表了。創建數據表可以通過使用CREATE TABLE語句。使用CREAT TABLE語句創建數據表的語法格式如下:
CREATE TABLE table_name( column_name1 datatype1 [constraint_condition1] [,column_name2 datatype2 [constraint_condition2]]… )
column_name1為指定數據表的列名;datatype1為指定列名的數據類型;constraint_condition1為指定列名的完整性約束。 為了保證數據的完整性,需要使用數據庫約束。約束主要包括唯一約束(UNIQUE)、主鍵約束(PRIMARY KEY)、外鍵約束(FOREIGN KEY)、檢查約束(CHECK)和非空約束(NOT NULL)。 唯一約束(UNIQUE)用來保證某一列或者一組列中沒有相同的值。如果為列定義了唯一約束,則該列中不允許出現重復的值,但是允許列中存在空值(即NULL值)。唯一約束即可以定義的表級上,也可以定義在列級上。一般在為列創建唯一約束後,數據庫會自動為該列建立一個唯一索引,其索引名與約束名是相同的。 主鍵約束(PRIMARY KEY)是用來保證使用主鍵約束的某一列或者一組列中有唯一的值,並且不能包含空值(即NULL值)。數據表中每一列只能定義一個PRIMARY KEY。一般在為列創建主鍵約束後,數據庫會自動為該列建立一個主索引,其索引名與約束名是相同的。 在創建數據表時,如果希望將多個列組合起來作為一個數據表中的主鍵,可以在PRIMARY KEY關鍵字後使用括號,將需要定義為主鍵的列放到PRIMARY KEY關鍵字後面的括號中。括號中的多個列之間需要使用逗號分割。 首先來考慮這樣一個問題,現在由於某種原因需要將一名學生在學校的全部信息刪除。這裡涉及學生信息的一共有兩個表,一個是學生信息表,一個是成績信息表。學生信息表保存的是學生的基本信息,成績信息表保存的是學生選課的課程成績信息。如果沒有定義外鍵約束,將該名學生從學生信息表中刪除時,而沒有將該名學生的選課的課程成績信息刪除,這樣就會造成兩個關聯表之間數據的不一致。 同樣的問題也可能出現在對兩個關聯表中數據的修改操作中。如果是多個表之間存在關聯關系的話,不定義外鍵約束,類似上面的情況很可能會發生。為了避免由於操作不當而引起的關聯表中數據的不一致,有必要為關聯表之間定義外鍵約束。 外鍵約束(FOERING KEY)主要是用來定義兩個表之間的關系。外鍵約束保證了表的參照完整性,確保對一個表的數據操作不會對與之關聯的表造成不利的影響。定義外鍵的語法格式如下:
FOREIGN KEY[表名1](列名1) REFERENCES 表名2(列名2) [ON UPDATE [CASCADE]|[SET NULL]|[RESTRICT]] [ON DELETE[CASCADE]|[SET NULL]|[RESTRICT]]
其後的ON UPDATE和ON DELETE分別指明了對表中的數據做修改和刪除時,主從表之間要采用的主要操作方式。 CASCADE:級聯刪除。如果主表中的一條數據記錄被刪除,那麼從表中與之相對應的的數據也將被一起刪除。 SET NULL:置空刪除。如果主表中的一條數據記錄被刪除,那麼從表中與之相對應的的數據也將被設置為空值。 RESTRICT:受限刪除。如果主表中的一條數據記錄被刪除,則在執行DELETE命令時數據庫管理系統會報錯,通知用戶與主表相對應的該數據在從表中仍然存在,但是與主表相對應的該數據在從表中不會被刪除。它是默認的方式。 檢查約束(CHECK)是用來限制列的取值范圍或者取值條件,使用CHECK約束可以保證數據規則的一致性。可以為一個列定義多個CHECK約束,當為列定義了CHECK約束後,該列中所對應的數據必須滿足指定的約束條件。 非空約束(NOT NULL)是用來保證在向該列插入數據時不允許插入空值(即NULL值)。非空約束只能用來約束列。