標籤:
關係型資料庫中的表非常類似紙面上的一張表:它由行和列組成。欄位的數目和順序是固定的,每個欄位都有一個名字。行的數目是變化的(它反映了給定時刻儲存的資料量)。 SQL 對錶中行的順序沒有任何承諾。當讀取一個表時,行將會以一個未指定的順序出現,除非你明確地要求排序。這些內容在http://www.infocool.net/PostgreSQL/index.htm裡介紹。另外,SQL 並不給行賦予唯一的標識,因此我們很可能在一個表中有好幾個完全相同的行。這是作為 SQL 基礎的下層數學模型的必然結果,但是這通常是我們不願意看到的。本章稍後的部分將討論如何處理這個問題。
每個欄位都有一個資料類型。資料類型控制著一個欄位所有可能值的集合,並且控制著欄位中資料的語義,這樣它就可以用於計算。比如,一個聲明為數實值型別的欄位不會接受任意文本字串,而儲存在這種欄位裡的資料可以用於數學計算。相比之下,一個聲明為字串類型的欄位接受幾乎任意類型的資料,但是它們不能進行數學計算(不過可以進行像字串串連之類的操作)。
PostgreSQL包含一套可剪裁的內建資料類型,這些類型可以適用於許多應用。使用者也可以定義它們自己的資料類型。常用的資料類型有:用於整數的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。類型名通常也是標識符(但是有一些例外)。請注意欄位列表是逗號分隔的,並且用圓括弧包圍。
當然,前面只是一個非常虛構的例子。通常,你會給表和欄位取一個有意義的名字,用以表達他們儲存的什麼類型的資料,所以還是讓我們給一個比較現實的例子:
CREATE TABLE products ( product_no integer, name text, price numeric);
numeric類型可以儲存分數部分,金額很可能有這樣的分數部分。
提示: 如果你建立了許多相互關聯的表,那麼最好為表和欄位選擇一致的命名模式。比如,表名字可以統一選擇單數或者複數,兩種選擇都有這樣那樣的理論家支援。
一個表能包含的欄位數目是有限制的。根據欄位類型的不同,這個數目可能在 250 到 1600 之間。不過,不管是哪一端的數字,如果你設計的表包含那麼多的欄位好像都很不可能發生,否則是設計上有問題的表現。
如果你不再需要一個表,那麼可以用DROP TABLE命令刪除它。像這樣:
DROP TABLE my_first_table;DROP TABLE products;
試圖刪除一個不存在的表是一個錯誤。不過,在 SQL 指令檔裡,我們通常在建立表之前無條件刪除它並忽略錯誤訊息,所以無論要刪除的表存不存在,這個指令碼都成功。當然你還可以使用DROP TABLE IF EXISTS來避免錯誤訊息,不過這並不符合 SQL 標準。
使用到目前為止討論的工具我們可以建立功能完整的表。本章剩下的部分是有關向表定義中增加特性、保證資料完整性、安全性或便利性的內容。
PostgreSQL表的基本概念