2024年9月26日: PostgreSQL 17 发布!
支持的版本:当前 (17) / 16 / 15 / 14 / 13 / 12
开发版本:devel
不支持的版本: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章,稍后再阅读本章的其余部分。

提交更正

如果您在文档中看到任何不正确的内容,与您对特定功能的体验不符,或者需要进一步澄清,请使用此表单 报告文档问题。