關係資料庫中的表就像紙上的表格一樣:它由行和列組成。列的數量和順序是固定的,並且每列都有一個名稱。行的數量是可變的——它反映了在給定時刻儲存了多少資料。SQL不保證表中行的順序。當讀取表時,行的出現順序是不確定的,除非明確要求排序。這在第 7 章中有介紹。此外,SQL不為行分配唯一識別符號,因此在一個表中可能存在多行完全相同的行。這是SQL所基於的數學模型的後果,但通常是不希望的。本章稍後我們將看到如何處理這個問題。
每列都有一個數據型別。資料型別限制了可以分配給列的可能值集,併為列中儲存的資料分配了語義,以便可以用於計算。例如,宣告為數值型別的列將不接受任意文字字串,並且儲存在此類列中的資料可用於數學計算。相比之下,宣告為字元字串型別的列將接受幾乎任何型別的資料,但它不適合數學計算,儘管其他操作(如字串連線)是可用的。
PostgreSQL包含一套相當大的內建資料型別,可以滿足許多應用程式的需求。使用者也可以定義自己的資料型別。大多數內建資料型別的名稱和語義都很明顯,因此我們將在第 8 章中對其進行詳細解釋。一些常用的資料型別包括:用於整數的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
。表名和列名遵循第 4.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指令碼檔案中,通常會無條件地在建立每個表之前嘗試刪除它,忽略任何錯誤訊息,這樣指令碼無論表是否存在都能正常工作。(如果您願意,可以使用DROP TABLE IF EXISTS
變體來避免錯誤訊息,但這並非標準SQL。)
如果您需要修改已經存在的表,請參閱本章後面的第 5.7 節。
透過迄今為止討論的工具,您可以建立功能齊全的表。本章的其餘部分將關注向表定義新增功能,以確保資料完整性、安全性或便利性。如果您急於立即填充表,可以跳到第 6 章,稍後再閱讀本章的其餘部分。
如果您在文件中發現任何不正確、與您在該功能上的體驗不符或需要進一步澄清的內容,請使用此表單來報告文件問題。