本章介绍我们如何创建一个保存我们的数据的数据库结构。 在关系型数据库里,裸数据是存储在表中的,因此本章的大部分内容都将用于介绍如何创建表以及如何修改他们, 以及我们在控制表中存储的数据上有什么可以获得的特性。随后, 我们讨论表是如何能组织成模式的,以及如何给表赋予权限。最后, 我们将简单查看一下影响数据存储的其他因素,比如继承,视图,函数,和触发器。
关系型数据库中的表非常类似纸面上的一张表:它由行和列组成。 字段的数目是固定的,每个字段都有一个名字。行的数目是变化的 -- 它反映在任意时刻里存储的数据量。SQL 对表中的行的顺序没有任何承诺---除非你要求明确地进行排序。 这些内容在 Chapter 7 里介绍。另外,SQL 并不给行赋予唯一的标识, 因此我们很可能在一个表中有好几个完全相同的行。 这是作为SQL的基础的下层数学模型的必然结果,但是通常是我们不愿意看到的。 本章稍后的部分将讨论如何处理这个问题。
每个字段都有一个数据类型。数据类型约束可以赋予一个字段的可能数值的集合, 并且约束存储在字段里的数据的赋值语义,这样它就可以用于计算。比如, 一个声明为一个数值类型的字段将不会接受任意文本字串,而存储在这样的字段里的数据可以用于数学计算。 相比之下,一个声明为字符字串类型的字段将接受几乎任意类型的数据, 但是它们自身是不能进行数学计算的,不过我们可以进行其他象字串连接这样的操作。
PostgreSQL 包含一套可剪裁的内置数据类型, 这些类型可以适用于许多应用。用户也可以定义它们自己的数据类型。 大多数内置的数据类型有显而易见的名字和语义,因此我们把详细的解释放在了 Chapter 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。表和字段的名字遵循我们在 Section 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 脚本文件里, 我们常见在创建表之前试图无条件删除它,忽略错误信息。
如果你需要修改一个已经存在的表,那么可以看看本章稍后的 Section 5.5。
使用到目前为止讨论的工具我们可以创建功能完整的表。 本章剩下的部分是有关向表定义中增加特性,保证数据完整性,安全性或者便利性的内容。 如果你急于给你的表填充数据,那么你可以忽略余下的部分直接到 Chapter 6,然后在稍后的时候再阅读本章。