表的基本概念

PostgreSQL 9.4.4 中文手册
上一页 | 上一级 | 章 5. 数据定义 | 下一页

# 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.5 节。

使用到目前为止讨论的工具我们可以创建功能完整的表。 本章剩下的部分是有关向表定义中增加特性、保证数据完整性、安全性或便利性的内容。 如果你急于给表填充数据，那么你可以忽略余下的部分直接到第 6 章， 然后在稍后的时候再回来阅读本章。

上一页 | 起始页 | 下一页
数据定义 | 上一级 | 缺省值