支援的版本: 目前 (17) / 16 / 15 / 14 / 13
開發版本: devel
不支援的版本: 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2

5.1. 表格基礎 #

關聯式資料庫中的表格很像紙上的表格:由列和欄組成。欄的數量和順序是固定的,而且每欄都有一個名稱。列的數量是可變的 — 它反映了在給定時刻儲存了多少資料。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 章,稍後再閱讀本章的其餘部分。

提交更正

如果您在文件中發現任何不正確、與您使用特定功能的經驗不符或需要進一步澄清的地方,請使用此表單來回報文件問題。