ddl-basics.md 3.9 KB
Newer Older
李少辉-开发者's avatar
李少辉-开发者 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
## 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)稍后阅读本章的其余部分。