Chapter 5. 資料定義

Table of Contents
5.1. 資料表的基本概念
5.2. 系統字串
5.3. 預設值
5.4. 約束
5.4.1. 檢查約束
5.4.2. 非空約束
5.4.3. 唯一約束
5.4.4. 主鍵
5.4.5. 外鍵
5.5. 繼承
5.6. 修改資料表
5.6.1. 增加字串
5.6.2. 刪除字串
5.6.3. 增加約束
5.6.4. 刪除約束
5.6.5. 改變一個字串的預設值
5.6.6. 修改一個字串的資料類型
5.6.7. 給字串改名字
5.6.8. 給字串改名字
5.6.9. 給資料表改名字
5.7. 權限
5.8. 模式
5.8.1. 建立一個模式
5.8.2. Public 模式
5.8.3. 模式搜索路徑
5.8.4. 模式和權限
5.8.5. 系統資料表模式
5.8.6. 使用方式
5.8.7. 移植性
5.9. 其它資料庫對像
5.10. 依賴性追蹤

本章介紹我們如何建立一個保存我們的資料的資料庫結構。 在關係型資料庫裡,裸資料是儲存在資料表中的,因此本章的大部分內容都將用於介紹如何建立資料表以及如何修改他們, 以及我們在控制資料表中儲存的資料上有什麼可以獲得的特性。隨後, 我們討論資料表是如何能組織成模式的,以及如何給資料表賦予權限。最後, 我們將簡單查看一下影響資料儲存的其他因素,比如視圖,函數,和觸發器。

5.1. 資料表的基本概念

關係型資料庫中的資料表非常類似紙面上的一張資料表:它由行和列組成。 字串的數目是固定的,每個字串都有一個名字。行的數目是變化的 -- 它反映在任意時刻裡儲存的資料量。SQL 對資料表中的行的順序沒有任何承諾---除非您要求明確地進行排序。 這些內容在 Chapter 7 裡介紹。另外,SQL 並不給行賦予唯一的標識, 因此我們很可能在一個資料表中有好幾個完全相同的行。 這是作為SQL的基礎的下層數學模型的必然結果,但是通常是我們不願意看到的。 本章稍後的部分將討論如何處理這個問題。

每個字串都有一個資料類型。資料類型約束可以賦予一個字串的可能數值的集合, 並且約束儲存在字串裡的資料的賦值語義,這樣它就可以用於計算。比如, 一個聲明為一個數值類型的字串將不會接受任意文本字串,而儲存在這樣的字串裡的資料可以用於數學計算。 相比之下,一個聲明為字元字串類型的字串將接受幾乎任意類型的資料, 但是它們自身是不能進行數學計算的,不過我們可以進行其他像字串連接這樣的操作。

PostgreSQL 包含一套可剪裁的內置資料類型, 這些類型可以適用於許多應用。用戶也可以定義它們自己的資料類型。 大多數內置的資料類型有顯而易見的名字和語義,因此我們把詳細的解釋放在了 Chapter 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。資料表和字串的名字遵循我們在 Section 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 腳本文件裡, 我們常見在建立資料表之前試圖無條件刪除它,忽略錯誤訊息。

如果您需要修改一個已經存在的資料表,那麼可以看看本章稍後的 Section 5.6

使用到目前為止討論的工具我們可以建立功能完整的資料表。 本章剩下的部分是有關向資料表定義中增加特性,保證資料完整性,安全性或者便利性的內容。 如果您急於給您的資料表填充資料,那麼您可以忽略餘下的部分直接到 Chapter 6,然後在稍後的時候再閱讀本章。