## 5.1.表格基础 [](<>)[](<>)[](<>) 关系数据库中的表很像纸上的表:它由行和列组成。列的数量和顺序是固定的,每列都有一个名称。行数是可变的——它反映了在给定时刻存储了多少数据。SQL不保证表中行的顺序。读取表时,除非明确请求排序,否则行将以未指定的顺序出现。这是一本书[第七章](queries.html)。此外,SQL不会为行分配唯一标识符,因此一个表中可能有几个完全相同的行。这是作为SQL基础的数学模型的结果,但通常并不可取。在本章后面,我们将看到如何处理这个问题。 每列都有一个数据类型。数据类型约束可分配给列的一组可能值,并为存储在列中的数据分配语义,以便将其用于计算。例如,声明为数字类型的列将不接受任意文本字符串,存储在此类列中的数据可用于数学计算。相比之下,声明为字符串类型的列将接受几乎任何类型的数据,但它本身不适合进行数学计算,尽管还可以进行字符串连接等其他操作。 PostgreSQL包含一组相当大的内置数据类型,适合许多应用程序。用户还可以定义自己的数据类型。大多数内置数据类型都有明显的名称和语义,因此我们将详细解释推迟到[第八章](datatype.html)。一些常用的数据类型包括`整数`对于整数,`数字的`对于可能的小数,`文本`对于字符串,`日期`关于约会,`时间`获取一天中的时间值,以及`时间戳`用于同时包含日期和时间的值。 [](<>) 要创建一个表,可以使用适当命名的[创建表格](sql-createtable.html)命令在该命令中,您至少要为新表指定一个名称、列的名称和每列的数据类型。例如: ``` CREATE TABLE my_first_table ( first_column text, second_column integer ); ``` 这将创建一个名为`我的第一张桌子`有两列。第一列被命名为`第一列`数据类型为`文本`; 第二列有名称`第二纵队`那类型呢`整数`.表名和列名遵循中解释的标识符语法[第4.1.1节](sql-syntax-lexical.html#SQL-SYNTAX-IDENTIFIERS).类型名通常也是标识符,但也有一些例外。请注意,列列表以逗号分隔,并用括号括起来。 当然,前面的例子是精心设计的。通常,您会给表和列指定名称,以传达它们存储的数据类型。让我们来看一个更现实的例子: ``` CREATE TABLE products ( product_no integer, name text, price numeric ); ``` (小标题)`数字的`类型可以存储小数部分,这是货币金额的典型情况。) ### 提示 创建许多相互关联的表时,明智的做法是为表和列选择一致的命名模式。例如,表名可以选择使用单数或复数名词,这两种名词都受到一些理论家或其他理论家的青睐。 一个表可以包含多少列是有限制的。根据柱的类型,它介于250和1600之间。然而,定义一个包含如此多列的表是非常不寻常的,而且往往是一个有问题的设计。 [](<>) 如果不再需要表格,可以使用[升降台](sql-droptable.html)命令例如: ``` DROP TABLE my_first_table; DROP TABLE products; ``` 试图删除不存在的表是错误的。然而,在SQL脚本文件中,通常会在创建每个表之前无条件地尝试删除它,忽略任何错误消息,这样无论该表是否存在,脚本都可以工作。(如果你愿意,你可以使用`删除表格(如果存在)`变量以避免错误消息,但这不是标准SQL。) 如果需要修改已存在的表,请参阅[第5.6节](ddl-alter.html)在本章后面。 使用到目前为止讨论的工具,您可以创建功能齐全的表。本章的其余部分将向表定义中添加功能,以确保数据完整性、安全性或方便性。如果你现在急于用数据填充表格,你可以跳到[第六章](dml.html)稍后阅读本章的其余部分。