本章介紹我們如何建立一個保存我們的資料的資料庫結構。 在關聯式資料庫裡,裸資料是儲存在表中的,因此本章的大部分 內容都將用於介紹如何建立表以及如何修改和我們在控制表中 儲存的資料上有什麼可以獲得的特性。隨後,我們討論表是如何 能組織成樣式的,以及如何給表賦予權限。最後,我們將簡單查看 一下影響資料儲存的其他因素,比如視圖,函數,和觸發器。這個 主題的詳細資訊將在 PostgreSQL 7.3 程式員手冊 中找到。
關聯式資料庫中的表非常類似紙面上的一張表:它由行和列組成。 欄位的數目是固定的,每個欄位都有一個名字。行的數目是變化的 -- 它反映在任意時刻裡儲存的資料量。SQL 對表中的行的順序沒有任何 承諾---除非你要求明確地進行排序。這些內容在 Chapter 4 裡介紹。另外,SQL 並不給行賦予唯一的標識,因此我們很可能在一個 表中有好幾個完全相同的行。這是作為SQL的基礎的下層數學模型的 必然結果,但是通常是我們不愿意看到的。本章稍後的部分將討論 如何處理這個問題。
每個欄位都有一個資料類型。資料類型約束可以賦予一個欄位的 可能數值的集合,並且約束儲存在欄位裡的資料的賦值語義,這樣 它就可以用於計算。比如,一個宣告為一個數值類型的欄位將不會 接受任意純文字字串,而儲存在這樣的欄位裡的資料可以用於數學計算。 相比之下,一個宣告為字元字串類型的欄位將接受幾乎任意類型的資料, 但是它們自身是不能進行數學計算的,不過我們可以進行其他象字串 連線這樣的操作。
PostgreSQL 包含一套可剪裁的內建 資料類型,這些類型可以適用於許多應用。使用者也可以定義它們自己 的資料類型。大多數內建的資料類型有顯而易見的名字和語義,因此 我們把詳細的解釋放在了 Chapter 5。有些常用的 資料類型是用於整數的 integer,用於可能為分數的 numeric,用於字串的 text,用於日期 的 date,用於時間的 time,以及用於 包含日期和時間的數值的 timestamp。
要建立一個表,你使用一個命名合適的 CREATE TABLE 命令。在這個命令裡,你至少為新表宣告一個名字,欄位的名字以及欄位的 資料類型。比如:
CREATE TABLE my_first_table (
first_column text,
second_column integer
);這樣就建立了一個有兩個欄位的叫做 my_first_table 的表。第一個欄位的名字是 first_column,資料類型為 text﹔第二個欄位的名字是 second_column, 資料類型是 integer。表和欄位的名字遵循我們在 Section 1.1.1 裡面解釋的標識符語法。 類型名通常也是標識符,但是有一些例外。請注意欄位清單是逗號分隔的, 並且用圓括弧包圍。
當然,前面的範例做了極大的變化。通常,你會給你的表和欄位名字, 這些欄位裡儲存它們保存的資料。所以還是讓我們給一個比較現實的 範例:
CREATE TABLE products (
product_no integer,
name text,
price numeric
);(numeric 類型可以儲存分數部分,金額很可能有 這樣的分數部分。)
竅門: 如果你建立了許多相互關聯的表,那麼最好選擇一種一致的命名樣式 來為你的表和欄位命名。比如,表名字可以選擇單數或者復數, 兩種選擇都有這樣那樣的理論家支援。
有一個小限制:一個表能包含的欄位數目。 根據欄位類型的不同,這個數目可能在250到1600之間。 不過,不管是那一端的數位,如果你設計的表包含那麼多的欄位好象都很不可能發生, 否則是設計上有問題的表現。
如果你不再需要這個表,那麼你可以用 DROP TABLE 命令刪除它。象這樣:
DROP TABLE my_first_table; DROP TABLE products;
試圖刪除一個不存在的表是一個錯誤。不過,在 SQL 腳本文件裡, 我們常見在建立表之前試圖無條件刪除它,忽略錯誤資訊。
如果你需要修改一個已經存在的表,那麼可以看看本章稍後的 Section 2.6。
使用到目前為止討論的工具我們可以建立功能完整的表。 本章剩下的部分是有關向表定義中增加特性,保証資料完整性,安全性或者便利性的內容。 如果你急於給你的表填充資料,那麼你可以忽略餘下的部分直接到 Chapter 3,然後在稍後的時候再閱讀本章。