关系型数据库中的表类似于纸质表格:由行和列组成。列的数量和顺序是固定的,并且每列都有一个名称。行数是可变的——它反映了在给定时刻存储的数据量。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 章,稍后再来阅读本章的其余部分。