关系数据库中的表很像纸上的表格:它由行和列组成。列的数量和顺序是固定的,每列都有一个名称。行的数量是可变的 — 它反映了在给定时刻存储的数据量。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 章,稍后再阅读本章的其余部分。
如果您在文档中发现任何不正确、与您使用特定功能的经验不符或需要进一步澄清的内容,请使用此表格报告文档问题。