10

10. 建立資料庫資料表

基礎工作的部署

資料表基本觀念

在檔案群組中建立資料表

使用 Null 值

增加IDENTITY屬性

利用 Enterprise Manager 建立資料表

本章總結

當資料庫建立完成（資料庫包括檔案和檔案群組），下一步就是建立資料表物件來保存資料。建立資料表是一個複雜的過程，本章會介紹建立資料表所需的考量。我們首先會介紹建立資料表的基本要求，研究其中項目，最後是範例介紹。

本章將介紹使用者資料型別與使用者自訂資料的型態，以及如何在檔案群組中儲存資料表、Null 值以及 IDENTITY 屬性。您也會學到如何利用 Enterprise Manager 和 Transact-SQL（T-SQL）來建立資料表，以及建立資料表的限制、資料表的預設值和索引。

注意

在建立資料表前，一定要先熟悉上述所提到的各項資料及元素。

基礎工作的部署

開始設計資料表前，必須對資料表作一些架構上的決定，這些決定可以讓您對整個資料表有一個概廓，在概廓之下逐一設計每一個資料表，以下列出哪些是您該考慮到的決定：

- 資料表會包含什麼資料？
- 要建立哪些資料行儲存資料？這些資料行的名稱為何？
- 資料行的資料範圍和型態該如何設定？
- 資料行是否能包含 Null 值？能否使用預設值？（使用 Null 值會比用預設值多一些步驟）。
- 哪些資料行該設成主索引鍵，哪些該設成外部索引鍵？
- 該指派給資料表哪些條件約束？
- 該利用哪一類型的索引（叢集或非叢集）？哪些資料行需要設定哪一類型的索引？
- 使用者對資料表的存取權限

在建立資料庫前，儘可能多面性的考量設計上的問題。可以在紙上草擬出整個資料表的結構，模擬使用者存取資料的模式，如哪些資料表應設成唯讀，哪些資料表可能插入、刪除或新增資料；哪些資料常被查詢、哪資料行常被搜尋等，以決定資料是否該儲存。了解資料表的結構便可決定如何建立資料表、索引、限定資料行資料及預設值等。下面會由基礎開始學習建立資料表。

資料表基本觀念

在這一節中，我們會複習一些簡單但重要的觀念。透過範例介紹基本要素，學習系統資料型別，及如何建立及刪除使用者自訂的資料型別。

定義資料表

資料表 （Table）是資料庫物件，其中包含資料庫內所有的資料，透過資料列和資料行的組合來儲存資料。資料表由資料行定義，資料可以以類似電子資料表的格式分類，如表10-1所示，表10-1是一個名為 Product_Info 的範例資料庫資料表。在範例中我們會將這個資料表建立在 MyDB 的資料庫內（沿用

第九章 的資料庫）。

Product_Info 資料表用來儲存商店內每一項商品的資料。當商品上了貨架，資料表就會增加一筆新的資料列。這個資料表有三列五欄的資料，資料行的名稱分別為 Product_ID、Product_Name、Description、Price 及 Brand_ID。我們也可以用 T-SQL 指令來建立資料表（不需實際輸入資料），在本章後面 〈選擇正確的資料型別〉 章節部分將會介紹。（本書 第二十章 會教導如何使用 INSERT 指令插入資料至資料表）。

表10-1 Product_Info 資料表

Product_ID | Product_Name | Description | Price | Brand_ID
--- | --- | --- | --- | ---
1 | 帳蓬 | 兩人用 | 80 | 12
2 | 瓦斯爐 | 使用天然瓦斯 | 20 | 33
3 | 登山包 | 耐用 | 60 | 15

定義資料行屬性是建立資料表很重要的一環。譬如定義資料行資料型別（data type）是否該限定該資料行的資料範圍（如字元長度等），SQL Server提供數種資料型別供使用者選擇，或是使用者自訂資料型別（您只能新增資料型別，不能改變系統已存在的資料型別）。

使用系統資料型別

資料表的資料型別可以設成以下幾種屬性：

- 該資料行所能包含的資料種類，如字元（character）、整數（integer）或圖像（image）
- 資料行中資料的大小或長度
- 有效位數（針對數值資料型別的設定），也就是資料行中數字資料所能包含的位數
- 小數位數（針對數值資料型別的設定），小數點右邊能接受的位數範圍

  資料型別也會影響檢視的資料行、預存程序的參數、變數和傳回一個或多個資料值的 T-SQL 函數。表10-2列出 SQL Server 提供的內建資料型別。SQL Server 2000 引進了三種新的資料型別－ bigint 、 sql_variant 和 table 。（除了資料表中標明的特殊情況外，所有物件都使用相同的基本資料型別）。

  表10-2 Server 2000系統資料型別

  資料型別 | 說明 | 儲存大小
  --- | --- | ---
  bigint | 8個位元組的整數（完整數字） | 8個位元組
  binary[(n)] | n個位元組固定長度的二進位資料。n必須在1到8000之間。當資料行中資料項目大小一致時，就應該使用binary。 | n + 4個位元組
  bit | 整數資料，其值為1、0或 Null。在bit資料行上不能建立索引。 | 對於資料表中的8位元資料行用1個位元組空間；對於9到16位元的資料行則用2個位元組空間，以此類推
  char[(n)] | 固定長度的非 Unicode 字元資料， | n個位元組
  | n的值必須為最1-8000。 |
  cursor | 資料指標的參考，僅用於變數和預存程序參數。 |
  datetime | 日期與時間資料，從1753年1月1日到9999年12月31日，精確度為三百分之一秒 | 8個位元組
  decimal[(p,[s])] or numeric[(p,[s])] | 固定有效位數及小數位數的數字 （numeric 在功能上等於decimal）。精確度（p）指定儲存位數的最大值（包括小數點的左右兩邊）。小數位數（s）指定小數點右邊儲存位數的最大值。小數位數應小於或等於有效位數。有效位數的最小值是1 | 5到17個位元組，取決於有效位數
  | ，最大值是28，若 SQL Server 以 -p參數啟動，最大值則可達38。 |
  float[(n)] | 浮點位數的數字資料，從-1.79E+ 308 到1.79E + 308。n是浮點數字的小數位數，範圍從1-53。 | 4到8個位元組，取決於精確度
  image | 可變長度的二進位資料，最大長度為2^31 - 1（2,147,483,647）個位元組。image 資料行的項目是指向image資料值儲存位置的指標，此資料與實際資料表的資料是分開儲存的。 | 指標可容許16個位元組
  integer or int | 整數（完整數字）資料從-2^31（-2,147,483,648） 至2^31 - 1（2,147,483,647）。 | 4個位元組
  money | 貨幣資料值從-2^63（-922,337, 203,685,477.5808） 到2^63 - 1（+922,337,203,685,477.5807），精確度到萬分之一貨幣單位。 | 8個位元組
  nchar[(n)] | 固定長度的 Unicode 字元資料，n的值從1到4000。每一個 Unicode字元使用2個位元組儲存，並支援國際字元。 | 2個位元組乘以輸入的字元數
  ntext | 可變長度的 Unicode 資料，最大長度為2^30 - 1（1,073,741,823）個字元。ntext 資料行項目是指向資料值位置的指標，此資料與實際資料表的資料是分開儲存的。 | 指標可容許16個位元組；以及輸入資料的字元數乘以2個位元組
  nvarchar | 可變長度的 Unicode 字元資料，最大長度為4000個字元。每一個Unicode 字元使用2個位元組儲存，並支援國際字元。 | 2個位元組乘以輸入的字元數
  real | 浮點位數的數字資料，從-3.40E+38到3.40E+38。Real的同義字是float（24）。 | 4個位元組
  smalldatetime | 日期與時間資料，從1900年1月1日到2079年6 月6日（datetime資料型別較為精準） | 4個位元組
  smallint | 整數資料，從2^15（-32,768）到2^15 - 1（32,767）。 | 2個位元組
  smallmoney | 貨幣資料值從-214.748,3648到+214,748.3647，精確度到千分之十貨幣單位。 | 4個位元組
  sql_variant | 此資料型別可儲存 text、ntext、timestamp 與sql_variant 以外的各種 SQL Server 支援的資料型別。sql_variant 可用於資料行、參數、變數、並傳回使用者自訂函數的值，sql_variant 允許這些資料庫物件支援其他資料型別值。 | 儲存大小不定
  sysname | 其為一個系統支援的使用者自訂資料型別，sysname為 SQL Server 定義為nvarchar(128)以用來參考儲存物件名稱的資料行。 | 256個位元組
  table | 就像使用暫存資料表一樣－宣告時必須包含資料行清單和資料型別。可用來儲存區域變數或使用者自訂函數的傳回值。 | 取決於資料表定義
  text | 可變長度的非 Unicode 資料，最大長度為2^31 - 1（2,147,483,647）個字元。其為指向資料值位置的指標，此資料與實際資料表的資料是分開儲存的。 | 指標需要16個位元組
  timestamp | 全資料庫唯一的數字，每當一資料 | 8個位元組
  | 列更新時，此數字便隨之更新。一 |
  | 個資料表只能夠有一個timestmap |
  | 欄位 |
  tinyint | 整數資料，從0到255。 | 1個位元組
  uniqueidentifier | 全域唯一識別項（GUID）。 | 16個位元組
  varbinary | 可變長度的二進位資料，最大長度 | 輸入資料的實際長度 +4
  | 為8,000個位元組。當資料行的資 | 個位元組
  | 料項目大小不一致時，可以使用 |
  | varbinary。 |
  varchar[(n)] | 可變長度的非 Unicode 資料，最大 | 實際輸入資料的長度
  | 長度為8,000個字元。 |

選擇正確的資料型別

選擇正確的資料型別是建立資料庫重要的一環。資料行中所儲存的資料值必須在允許範圍之內，並拒絕儲存資料型別不符的資料（譬如說資料行只允許輸入數字值時，當輸入字元值時就不能允許資料輸入）。一旦指定了資料型別就可以避免上述的情況。下列兩個問題可以幫助您決定該指定何種資料型別：

- 這個資料型別是否和將輸入的資料吻合？
- 資料行該設為固定長度或可變長度？

  選擇合適的資料型別的過程十分直覺化，也就是資料行中所輸入的資料只要符合該資料行指定的資料型別即可。因此，您要預測該資料行可能輸入資料的範圍，這個範圍要可以涵蓋未來資料值的範圍，卻又不浪費空間。 浪費空間 是指我們對一個資料行預留了資料值的範圍，但範圍設得太過寬鬆而浪費了預留下來的空間。舉個例子，假設您需要一個資料行來儲存從1到100的整數資料，當然您可以將資料行設定為 integer 資料型別，但是每一個整數就佔用4個位元組的空間。若是將資料行設為 tinyint 資料型別（0到255之間的值），就只佔用1個位元組的空間。因此這個資料行就建議設為 tinyint。

  另一個要考慮的是資料行應使用固定長度，還是可變長度的資料型別。如果資料行中所有的值幾乎都是相同大小，就建議使用固定長度。至於可變長度的資料型別則在當資料值的大小不固定，或是當資料本身不經常變更時適用。可變長度的資料型別包括 varchar、nvarchar、varbinary、text、ntext 和 image。彈性的運用可變長度資料型別可明顯地節省儲存空間。如果您將資料行依最長的資料值定義成固定長度，那麼資料行中較短的資料值也會佔據同樣大小的儲存空間，這樣還不如設為可變長度以節省空間。那為什麼我們不把所有資料行都設成可變長度呢？其實是因為系統要花較長的時間處理可變長度的資料行。所以，如果能確定資料值的長度是固定的，還是把資料行設為固定長度。

  利用系統資料型別建立 Product_Info 資料表

  在開始之前，先看看 T-SQL 的 CREAT TABLE 命令（用以建立如表10-1的Product_Info 資料表）。在這個範例中只會使用系統資料提供的資料型別與固定長度資料列。

  當使用 T-SQL 命令來建立資料表時，資料表即建立在使用中的資料庫上。欲使用某一個資料庫，請依下面語法使用 USE database_name 命令。在這個範例中，我們的資料庫取名為 MyDB 。關鍵字 GO 指示現在應該執行所有在該列前面的命令。（請參閱

第13章 使用T-SQL詳細的內容。）

    USE MyDB
    GO
    CREATE TABLE Product_Info
    (
    Product_ID smallint,
    Product_Name char(20),
    Description char(30),
    Price smallmoney,
    Brand_ID smallint
    )
    GO

在輸入 CREATE TABLE 命令之後，將資料表名稱指定為 Product_Info。在括號中間，在資料行名稱後即定義各資料行的資料型別。兩個char 資料型別的長度各設定為20及30（因考慮Product_Name及描述約落在這個數值範圍內）。由於我們預計會超過255項產品與進貨廠商，但少於32,767項產品與進貨廠商，為避免浪費空間或空間不足，因此將 Product_ID 及 Brand_ID 設為smallint資料型態（tinyint的範圍是從0到255，而smallint的範圍則至32,767），而不是tinyint或int。

使用者自訂資料型別

使用者自訂資料型別 （或稱別名資料型別）即被自訂的系統資料型別。當數個資料表同一資料行的資料型別要相同時，如相對應的資料行要一樣的型別、長度和 Null 值屬性，就可利用自訂資料型別。您可以使用描述性的名稱來定義資料型別，讓程式設計簡單化，並保持一致性。

舉例來說，現在在同一個資料庫有兩個資料表，一個為 Brands 資料表；一個為 Product_Info 資料表。 Brands 資料表中的 Brand_ID 資料列要和 Product_Info 資料表中的 Brand_ID 資料列有相同的資料型別，且不允許 Null 值。這時可以建立使用者自訂資料型別，並分配給這兩個資料行。現在假定有幾個資料表，其中的幾個資料行需要相同的屬性。您也許不記得其中某一個資料表中的資料行是使用了 smallint 還是tinyint，或者是否使用 Null 值。但如果之前已使用描述性名稱建立使用者自訂資料型別，就可使用自訂資料型別，而不必擔心實際的資料型別為何。

說明

當於特定的資料庫中建立使用者自訂資料型別，它只能用於該資料庫中。但如果在 model 資料庫（資料庫範本）中建立資料型別，則可在所有之後新建立的資料庫中使用。

利用 Enterprise Manager 建立使用者自訂資料型別

建立使用者自訂資料型別時，必須提供三項資訊：

- 資料型別名稱。
- 新資料型別是以哪一個系統資料型別為基礎。
- 資料型別的 Null 值屬性，即為是否允許 Null 值（在本章的 〈使用Null值〉 部分會詳細討論）。

  當以上幾項資訊決定了，即可利用 Enterprise Manger 建立使用者自訂資料型別：

  1. 在 Enterprise Manager 中，展開 SQL Server 群組，然後展開伺服器。
  2. 展開 資料庫 資料夾，展開一個資料庫，如圖10-1所示。

     圖10-1 使用Enterprise Manager定義資料型別

  3. 在 使用者自訂資料型別 上按滑鼠右鈕，從快顯功能表中選擇 新增使用者自訂資料型別 。出現 使用者自訂的資料型別屬性 視窗。
  4. 在 名稱 欄內輸入新資料型別的名稱。暫且先命名為 Brand_type ，如圖10-2所示。

     圖10-2 「使用者自訂的資料型別屬性」視窗

  5. 接著必須指定使用者自訂型別所參照的 SQL Server 系統資料型別及長度。以這個範例為例，先將進貨商代碼資料列定義 smallint 這個資料型別（預設長度值為5）。如果是建立文字資料型別，可定義長度。
  6. 如果資料型別允許空值，則選擇 允許NULL 。（空值的詳細資訊請參看本章 〈使用Null值〉 部分。）
  7. 如果資料型別使用預先定義的規則或預設值，則分別從清單方塊中選擇它們。（規則和預設值將在 第16章 中詳細討論。）
  8. 按 確定 儲存新資料型別。

  使用 Enterprise Manager 刪除使用者自訂資料型別

  您可以利用以下步驟刪除不需要的使用者自訂資料型別：

  1. 在 Enterprise Manager 中，找到欲刪除的使用者自訂資料型別（展開 SQL Server 群組/伺服器/資料庫資料夾，然後展開想刪除資料型別的資料庫），如圖10-3所示。
  2. 選擇 使用者自訂資料型別 資料夾。使用者自訂資料型別將顯示在右邊的窗格中，如圖10-3所示。

     圖10-3 「使用者自訂資料型別」資料夾

  3. 在欲刪除的使用者自訂資料型別上按滑鼠右鈕，在快顯功能表中選擇 刪除 ，進入 卸除物件 ，如圖10-4所示。

     圖10-4 「卸除物件」對話方塊

  4. 在真正刪除資料型別之前，先按一下 顯示依存的情況 進入 依存性 對話方塊，如圖10-5所示。

     圖10-5 「依存性」對話方塊

     依存性對話方塊左邊的清單方塊顯示依存於該使用者自訂資料型別的資料庫物件，右邊的清單方塊顯示了使用者自訂資料型別所依存的物件。如果有任何資料表或物件使用了此資料型別，系統將不允許刪除。否則會出現錯誤訊息，如圖10-6所示。

     圖10-6 刪除使用中的資料型別所出現的錯誤訊息

  5. 如果欲刪除的資料型別沒有相依性方面的問題，就可以關閉相依性對話方塊，按一下 卸除物件 視窗中的 卸除全部 ，即刪除資料型別。不用擔心， 卸除全部 指的是刪除 卸除物件 視窗中顯示的資料型別，而不是所有的使用者自訂資料型別。

  使用 T-SQL 建立及刪除使用者自訂資料型別

  系統預存程序 sp_addtype 是用來定義使用者資料型別的 T-SQL 命令。當使用 model 資料庫時，執行此命令，就會讓所有新建立的使用者自訂資料庫都使用這個新的資料型別（因為所建立的使用者自訂資料型別都和model資料庫的屬性相同）。當您利用使用者自訂的資料庫時執行此命令時，只會讓該資料庫使用新的資料型別。（記住，要使用某一個資料庫，必須執行執行 USE database_name 命令。）下面的 T-SQL 命令在 model 資料庫中建立了一個使用者自訂資料型態：Brand_type。

      USE model
      GO
      sp_addtype Brand_type, 'smallint', 'NOT NULL'
      GO

  sp_addtype 的三個參數分別為：使用者自訂資料型別名稱、新資料型別以何種系統資料型別為基礎，及新資料型別的 Null 值屬性。新資料型別 Brand_type 將出現在所有使用者自訂的資料庫中。如果在使用者資料庫中建立了使用者自訂資料型別，並要在 Enterprise Manager 中看到該型別，請在 Enterprise Manager 的執行功能表上選擇 重新整理 。

  要刪除一個未被使用的使用者自訂資料型別，在定義它的資料庫中執行 sp_droptype 命令。以下示範從 model 資料庫中刪除 Brand_type 這個使用者自訂的型別：

      USE model
      GO
      sp_droptype Brand_type
      GO

  使用使用者自訂資料型別別建立 Product_Info 與 Brand資料表

  先回到資料庫資料表的範例。利用自訂的資料型別－ Brand_type ，重新建立 Product_Info 資料表，然後再建立 Brand 資料表。在 Brand 資料表和 Product_Info 資料表中都會有 Brand_ID 這個資料行，我們會用相同的使用者自訂型別。首先，先刪除舊的 Product_Info 資料表，然後重新建立，步驟如下：

      USE MyDB
      GO
      DROP TABLE Product_Info
      GO
      CREATE TABLE Product_Info
      (
      Product_ID smallint,
      Product_Name char(20),
      Description char(30),
      Price smallmoney,
      Brand_ID Brand_type
      )
      GO
      CREATE TABLE Brand
      (
      Brand_ID Brand_type,
      Brand_Name char(30),
      Supplier_ID smallint
      )
      GO

  將 Brand_type 這個資料型別指定到兩個資料表中的 Brand_ID 資料行，就可確定兩個資料行有一樣的屬性，而無須記住基底資料型別。

  通常需要記住使用者自訂型別資料的就是 DBA 和應用程式的程式設計師。DBA 不用說當然要了解這些，程式設計師則在寫程式碼時可能需要知道資料型別，至於使用者則不需要知道這些細節。

  在檔案群組中建立資料表

  如果您已經建立了使用者定義檔案群組，SQL Server 可讓您指定資料表和資料儲存在哪一個檔案群組中。預設情況下，除非另一個檔案群組被指定為預設檔案群組，否則資料表會儲存在主要檔案群組中。檔案群組可以橫跨多個磁碟或磁碟陣列上。要詳細瞭解資料表的資料如何存放在檔案和檔案群組中，請參閱

  第9章 。

  在檔案群組中建立 Product_Info 資料表

  假設我們在 MyDB 資料庫中建立一個命名為 Product_group 的檔案群組，這個檔案群組放置在次要檔案群組所在的E磁碟中，而主要檔案群組則在C磁碟中。這個技巧可讓我們將資料及資料表和 SQL Server 系統資料表分開放置。我們還將在磁碟F建立一個記錄檔，以分開記錄檔I/O（請參閱本書 第9章 利用檔案群組建立資料庫）。

      USE master
      GO
      CREAT DATABASE MyDB
      ON PRIMARY                     	--清楚定義主要檔案群組（選擇性）
      			        --主要資料檔案
      (NAME = MyDBroot,
      FILENAME = 'c:\mssq12k\MSSQL\data\mydbroot.mdf'
      SIZE = 8MB,
      MAXSIZE = 10MB,
      FILEGROWTH = 1MB),
      FILEGROUP product_group         --下一個檔案儲存的檔案群組
      (NAME = MyDBdata1,              --次要資料檔案
      FILENAME = 'e:\mssq12k\MSSQL\data\mydbdata1.ndf',
      SIZE = 100MB,
      MAXSIZE = 1500MB,
      FILEGROWTH = 100MB)
      LOG ON
      (NAME = Logdata1,           	--記錄檔
      FILENAME = 'f:\long_files\logdata1.ldf',
      SIZE = 100MB
      MAXSIZE = 1500MB,
      FILEGROWTH = 100MB)
      GO

  現在您可以使用 CREATE TABLE 命令，將 Product_Info 資料表建立在 product_group 檔案群組內，方法如下：

      USE MyDB
      GO
      CREATE TABLE Product_Info
      (
      Product_ID smallint,
      Product_Name char(20),
      Description char(30),
      Price smallmoney,
      Brand_ID brand_type
      )
      on product_group
      GO

  新增的資料表及所有插入資料表的資料都會放置在定義 Product_group 的E磁碟，因此，只要在同樣的檔案群組內沒有建立其他的資料表， Product_Info 資料表中資料的I/O就有一個專門的磁碟。

  使用 Null 值

  空值 （Null value）是指未知的值，我們將這樣的值稱為 Null 。資料行的 Null值屬性 是指該資料行是否接受或拒絕Null值。一個資料行中的Null值通常表示該資料行中沒有值輸入，可能因為這個值未知的、不適用的、或是以後才要新增。Null 值既不是沒有這個值，也不是0；它們的實際值是未知的。因此，任何兩個 Null 值永遠不會相等。

  那麼何時會用到 Null 值呢？舉例來說，當客戶不能提供所有資料列的資訊時，就需要 Null 值。例如，客戶的網址，也許客戶並沒有網址，這個資料列就無法輸入資料，這時一個資料列中的 Null 值就有了意義，也就是說現在這個資料列的資料尚未決定。

  就一般的規則而言，盡可能避免使用 Null 值，因為這會增加查詢和更新時的複雜度，而且有些選項（如主索引鍵和 IDENTITY 屬性）不可在包含 Null 值的資料列中使用。

  相關資訊

  在 SQL Server《線上叢書》，輸入『Null值』這個關鍵字，在清單中選取 比較搜尋條件 即可找到相關資訊。或是在本章

  〈增加IDENTITY屬性〉 一節有提到更多的相關資訊。

  您可以為資料行指定預設值以避免使用 NULL，所以如果一個資料行沒有輸入值，該資料行中就會自動填入預設值。（關於預設值的詳細資訊請參看 第16章 。）如果在一個資料行中允許空值， NULL將以兩種方法輸入該資料行：

- 如果在資料表中插入一資料列，但未對該空資料列指定資料值，SQL Server會為該資料行指定為 NULL值（除非該資料行已指定預設值）。
- 使用者可以手動輸入 NULL這個字。請注意，不要輸入引號（"），以免被當作字串NULL而造成混淆。

  使用 NULL 建立 Product_Info 資料表

  回到 Product_Info 資料表的範例，現在為每一個資料行增加空值選項。如果想讓某一資料行允許Null值，請在資料型別後新增 NULL。如果不想允許Null值，則在資料型別後新增 NOT NULL。除非在使用使用者自訂資料型別，且該資料型別已有定義 NULL或 NOT NULL，否則為資料行指定是否允許Null值是不錯的習慣。這樣可幫助您每次在設定一個資料行時都考慮到該資料行的Null值屬性。

  相關資訊

  在 SQL Server《線上叢書》，輸入『CREATE TABLE』，向下尋找 資料表定義中的空值屬性規則 主題，即可找到當 NULL或 NOT NULL 不明確指定時，資料行NULL值屬性會遵照的規則。

  回到 Product_Info 資料表的範例，替產品描述這個資料列定義接受Null值。由於 Brand_type 資料型別在之前已定義為 NOT NULL，因此不需替 brand_type 資料型別指定Null值屬性。新的CREATE TABLE命令如下：

      USE MyDB
      GO
      DROP TABLE Product_Info
      GO
      CREATE TABLE Product_Info
      (
      Product_ID smallint NOT NULL,
      Product_Name char(20) NOT NULL,
      Description char(30) NULL,
      Price smallmoney NOT NULL,
      Brand_ID brand_type
      )
      GO

  現在，如果未指定產品描述的值，但其他四個資料行的值均有指定（在 Product_ID、Product_Name、Price、Brand_ID 這幾個不接受Null值的資料行中），當輸入一個產品的資料時，在資料表中會為 Description 資料行，插入 NULL在新的資料列中。如果四個不接受Null值的資料行中未輸入資料，則資料列新增不會成功。

  增加IDENTITY屬性

  建立資料表時，可以在資料行定義中增加IDENTITY屬性，把某一個資料行指定為識別項資料行。如果建立的資料行具IDENTITY屬性，它可讓新插入的資料列依種子和遞增值自動編制資料列值。 種子 （seed）是插入資料表的第一個資料列所指定識別編號。每一次插入一資料列時，會藉著將遞增值加至初始值來產生下個識別值，這個識別值能保證其所在資料表的唯一性。如果每一資料行都需要一個唯一的識別號碼來確定其資料列的唯一性（如Product_ID資料行），識別編號屬性就非常適用，無須每次新增資料列時還要考慮編號到了哪裡。在一個資料表中，識別項資料行通常被當作主索引鍵條件約束使用，以利用其唯一性識別一個資料列。在本書

  第16章 中可以找到更多有關主索引鍵條件約束的資訊。

  舉例來說，如果指定了IDENTITY（0,10），則插入第1列的識別項資料行的值即為0、第2列為10、第3列為20，依此類推。如果不指定，預設的種子值和遞增值為（1,1）。您必須指定兩個參數或乾脆都不指定。識別項資料行中不能有預設值、也不允許Null值。一個資料表只能有一個識別項資料行。

  預設情況下，識別項資料行不能直接插入資料，也不能更新。如果您想重新插入已經刪除的列，而且希望保留原來的識別值，您可以使用下面的敘述來修改預設設定：

      SET INDETITY_INSERT tablename ON

  使用這個陳述式就能插入資料列，並指定識別資料行的值。完成之後，應再使用下面的命令拒絕識別項資料行插入資料：

      SET IDENTITY_INSERT tablename OFF

  執行了上述的命令後，在下次插入新資料列時，SQL Server 就會以當時識別值中的最大值為種子值，進行遞增的程序。

  在 Product_Info 資料表中增加 IDENTITY 屬性

  現在我們將在 Product_Info 資料表增加IDENTITY屬性。我們將把 Product_ID 資料行作為識別項資料行，此資料行中不以手動輸入資料，而改由 SQL Server 自動產生識別值，以確保該識別值的唯一性。下面是建立資料表的 T-SQL 語法：

      USE MyDB
      GO
      DROP TABLE Product_Info
      GO
      CREATE TABLE Product_Info
      (
      Product_ID smallint IDENTITY(1,1) NOT NULL,
      Product_Name char(20) NOT NULL,
      Description char(30) NULL,
      Price smallmoney NOT NULL,
      Brand_ID brand_type
      )
      GO

  Product_ID 資料行的值將從1開始，並以1做為後續插入到資料表中資料列的遞增值，以確保每一項產品唯一的識別值，而不需仰賴使用者自行輸入數值。遞增值可任意選擇，但無論您使用的遞增值為何，識別值都會是唯一的。

  利用 Enterprise Manager 建立資料表

  現在我們來使用 Enterprise Manager 建立資料表。記得，在實際建立資料庫前，應先清楚所有資料庫資料表以及相互間的關聯性。要使用 Enterprise Manager 建立資料庫資料表，請遵循以下步驟：

  1. 在 Enterprise Manager 中展開 SQL Server群組 ，展開資料庫。
  2. 展開 資料庫 資料夾，檢視現存的資料庫。
  3. 展開想要操作的資料庫，這裡我們用 MyDB 。
  4. 在 資料表 資料夾按一下滑鼠右鈕以顯示快顯功能表，選擇 新增資料表 。出現新資料表視窗，如圖10-7所示（此為最大化圖示）。

     圖10-7 「新資料表」視窗

     新資料表 視窗包含一個如同試算表一樣的方格。方格中的每一列代表資料表中每一個資料行；每一個在方格中的資料行代表屬性－如資料型別、長度及Null值屬性。

     說明

     在為資料表的資料行命名時，應該採用一定的標準。採用什麼命名標準並不重要，但命名的邏輯必須有其一致性。這種一致性可在執行查詢時避免混亂。

  5. 定義資料庫中的每一個資料行（一列一列的定義），將名稱輸入 資料行名稱 中，在 資料型別 資料行中可選取下拉式清單，定義資料型別。選擇符合資料型別及該資料列的長度，在 是否允許Null值 資料列中按下SHIFT鍵或在該資料列中的方框中打勾以允許 Null 值（不打勾則不允許 Null 值）。 Product_Info 資料表如圖10-8所示。請注意在 Brand_ID 這一資料行中，我們將 資料型別 設成使用者自訂的資料型別 brand_type。要注意的是，雖然在自訂這個資料型別時，我們已將 Brand_type 定義不接受 Null 值，但在 是否允許Null值 資料行中仍會將允許Null值設成預設（會打勾）。所以在這裡必須將 是否允許Null值 的選取取消，以維持資料型別 Null 值屬性的一致性。

     資料的儲存順序會依您定義資料行的順序儲存。如果想在已輸入的資料列間插入新資料列，點選欲插入的資料列後按一下滑鼠右鈕叫出快顯功能表，選擇 插入資料行 ，如欲刪除則選取想刪除的資料列後按一下滑鼠右鈕，在快顯功能表中選擇 刪除資料行 。現在我們將在 Product_Info 資料表中將 Product_ID 資料行設成主索引鍵。選取 Product_ID 資料列後，按一下滑鼠右鈕，在快顯功能表中選擇 設定主索引鍵 ，或是選取 Product_ID 資料列後，直接按一下工具列上 鑰匙 的圖示。就可在資料行名稱旁看到如圖10-9所示的 鑰匙 圖示。在本書

  第16章 會討論主索引件和其他條件約束。

  圖10-8 定義資料行的新資料表視窗

- 在此視窗下方有 資料行 標籤頁，這個標籤頁可讓您更改上方一些資料行的屬性。舉例來說，選擇 Brand_ID 資料行，然後在 資料行 標籤頁中的 描述 輸入一些資料，在 預設值 中輸入0，如圖10-10所示。

  圖10-9「主索引鍵」的鑰匙圖示

  圖10-10 「資料行」標籤頁

- 在資料表中可設定其他的條件約束和索引，在資料行名稱上按一下滑鼠右鈕，從快顯功能表中選擇 索引/索引鍵 、 關聯性 、 檢查條件約束 或 屬性 。或按工具列上 存檔 圖示旁的 資料表和索引屬性 圖示。任何一種方法都可讓您進入 屬性 視窗，如圖10-11所示。您所建立的資料表可能會在 選定的資料表 的欄位出現如Table1、Table2這樣的選項。我們在這裡選擇Table2，您可以依下一個步驟的做法更改名稱。這個視窗共有4個標籤頁。本書中會陸續介紹各標籤頁詳細的設定方法。

  圖10-11 資料表和索引的「屬性」視窗

- 要替新資料表命名，按一下 存檔 圖示，這時會出現 選擇名稱 對話方塊，這時便可以重新輸入資料表名稱。名稱輸入後按 確定 即可儲存該資料表及所有設定。當您將此視窗關閉，就可在 Enterprise Manager 的右方視窗中看到剛才新增的資料表。

本章總結

在本章中，我們學習了建立資料表，包括使用及自訂資料型別、在檔案群組中儲存資料表、使用Null值和增加IDENTITY屬性。事實上還有很多其他屬性可以增加到資料表中。您可以增加或刪除欄位、增加條件約束和索引，以及修改資料表。當然，在最理想的情況下，所建立的資料表就是最適用的資料表，但這幾乎是不可能的，因為在許多情況下您會在資料表建立後才發現需要增加之前沒有考慮到的索引或條件約束。

第15章 示範了幾個使用 T-SQL 來修改資料表的方法。在以下幾章中，您會學習安裝和設定網路，以及學習 Microsoft Cluster Server。