# 5.1.表格基础

关系数据库中的表很像纸上的表:它由行和列组成。列的数量和顺序是固定的,每列都有一个名称。行数是可变的——它反映了在给定时刻存储了多少数据。SQL不保证表中行的顺序。读取表时,除非明确请求排序,否则行将以未指定的顺序出现。这是一本书第七章。此外,SQL不会为行分配唯一标识符,因此一个表中可能有几个完全相同的行。这是作为SQL基础的数学模型的结果,但通常并不可取。在本章后面,我们将看到如何处理这个问题。

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

PostgreSQL包含一组相当大的内置数据类型,适合许多应用程序。用户还可以定义自己的数据类型。大多数内置数据类型都有明显的名称和语义,因此我们将详细解释推迟到第八章。一些常用的数据类型包括整数对于整数,数字的对于可能的小数,文本对于字符串,日期关于约会,时间获取一天中的时间值,以及时间戳用于同时包含日期和时间的值。

要创建一个表,可以使用适当命名的创建表格命令在该命令中,您至少要为新表指定一个名称、列的名称和每列的数据类型。例如:

CREATE TABLE my_first_table (
    first_column text,
    second_column integer
);

这将创建一个名为我的第一张桌子有两列。第一列被命名为第一列数据类型为文本; 第二列有名称第二纵队那类型呢整数.表名和列名遵循中解释的标识符语法第4.1.1节.类型名通常也是标识符,但也有一些例外。请注意,列列表以逗号分隔,并用括号括起来。

当然,前面的例子是精心设计的。通常,您会给表和列指定名称,以传达它们存储的数据类型。让我们来看一个更现实的例子:

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

(小标题)数字的类型可以存储小数部分,这是货币金额的典型情况。)

# 提示

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

一个表可以包含多少列是有限制的。根据柱的类型,它介于250和1600之间。然而,定义一个包含如此多列的表是非常不寻常的,而且往往是一个有问题的设计。

如果不再需要表格,可以使用升降台命令例如:

DROP TABLE my_first_table;
DROP TABLE products;

试图删除不存在的表是错误的。然而,在SQL脚本文件中,通常会在创建每个表之前无条件地尝试删除它,忽略任何错误消息,这样无论该表是否存在,脚本都可以工作。(如果你愿意,你可以使用删除表格(如果存在)变量以避免错误消息,但这不是标准SQL。)

如果需要修改已存在的表,请参阅第5.6节在本章后面。

使用到目前为止讨论的工具,您可以创建功能齐全的表。本章的其余部分将向表定义中添加功能,以确保数据完整性、安全性或方便性。如果你现在急于用数据填充表格,你可以跳到第六章稍后阅读本章的其余部分。