关系型数据库中的表非常类似纸面上的一张表:它由行和列组成。字段的数目是固定的,每个字段都有一个名字。行的数目是变化的(它反映了任意时刻存储的数据量)。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.5。
使用到目前为止讨论的工具我们可以创建功能完整的表。本章剩下的部分是有关向表定义中增加特性、保证数据完整性、安全性或便利性的内容。如果你急于给表填充数据,那么你可以忽略余下的部分直接到章6,然后在稍后的时候再回来阅读本章。