5.1. 表格基础

关系数据库中的表很像纸上表:它由行和列组成。列的数量和 Sequences 是固定的,并且每列都有一个名称。行数是可变的-它反映了给定 Moment 存储了多少数据。 SQL 对表中行的 Sequences 不做任何保证。读取表时,除非明确要求排序,否则行将以未指定的 Sequences 显示。 Chapter 7对此进行了介绍。此外,SQL 不会为行分配唯一标识符,因此表中可能有几条完全相同的行。这是基于 SQL 的 math 模型的结果,但通常是不希望的。在本章的后面,我们将看到如何处理这个问题。

每列都有一个数据类型。数据类型限制了可以分配给列的可能值的集合,并为存储在列中的数据分配了语义,以便可以将其用于计算。例如,声明为数字类型的列将不接受任意文本字符串,并且存储在此类列中的数据可用于 math 计算。相比之下,声明为字符串类型的列几乎可以接受任何类型的数据,但是它不适合进行 math 计算,尽管可以使用其他操作,例如字符串连接。

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中说明的标识符语法。类型名称通常也是标识符,但是有一些 exception。请注意,列列表用逗号分隔,并用括号括起来。

当然,前面的示例是人为设计的。通常,您将为表和列命名,以传达它们存储的数据类型。因此,让我们看一个更现实的例子:

CREATE TABLE products (
    product_no integer,
    name text,
    price numeric
);

(numeric类型可以存储小数部分,这是典型的货币金额.)

Tip

创建许多相互关联的表时,明智的做法是为表和列选择一致的命名模式。例如,可以选择使用单数形式或复数形式的名词作为表名,这两者都受到某些理论家或其他理论家的青睐。

一个表可以包含多少列是有限制的。根据列的类型,它介于 250 到 1600 之间。但是,定义一个表中包含如此多列的位置的表是非常不寻常的,并且通常是一个有问题的设计。

如果您不再需要表,则可以使用DROP TABLE命令将其删除。例如:

DROP TABLE my_first_table;
DROP TABLE products;

尝试删除不存在的表是一个错误。但是,在 SQL 脚本文件中,通常会在创建表之前无条件地尝试删除它们,而忽略任何错误消息,以便脚本无论表是否存在都可以工作。 (如果愿意,可以使用DROP TABLE IF EXISTS变体来避免出现错误消息,但这不是标准的 SQL.)

如果需要修改已经存在的表,请参阅本章稍后的Section 5.5

使用到目前为止讨论的工具,您可以创建功能齐全的表。本章的其余部分涉及为表定义添加功能以确保数据完整性,安全性或便利性。如果您现在渴望用数据填充表格,则可以跳到Chapter 6,稍后再阅读本章的其余部分。