PostgreSQL - 自动递增

你好,有抱负的数据库爱好者们!今天,我们将深入了解PostgreSQL中最有用的功能之一:自动递增(AUTO INCREMENT)功能。作为你友好的邻居计算机老师,我很兴奋能引导你学习这个话题,即使你完全是个编程新手。所以,拿起一杯咖啡,让我们一起踏上这个学习冒险之旅!

PostgreSQL -  Auto Increment

AUTO INCREMENT是什么?

在我们深入了解之前,先来理解一下AUTO INCREMENT到底是什么。想象一下,你正在组织一个大型派对,需要给每位客人分配一个唯一的编号。如果你有一个神奇的计数器,能够为每位新客人自动递增,那岂不是很好?这正是数据库中AUTO INCREMENT所做的!

在PostgreSQL中,AUTO INCREMENT是一个为表中的每一行自动生成唯一数字的功能。当你需要一个唯一标识符来标识每条记录,如客户ID或订单号时,它特别有用。

语法

现在,让我们看看如何在PostgreSQL中使用AUTO INCREMENT。语法相当简单,但如果你一开始觉得有些吓人,别担心。我们会一步步分解。

CREATE TABLE table_name (
column_name SERIAL PRIMARY KEY,
other_column1 data_type,
other_column2 data_type,
...
);

让我们来分析一下这个语法:

  1. CREATE TABLE table_name:这一部分创建了一个你指定名称的新表。
  2. column_name SERIAL PRIMARY KEY:这是魔法发生的地方!
  • column_name是你想要给自动递增列的名称。
  • SERIAL是PostgreSQL特有的数据类型,它创建了一个自动递增的整数列。
  • PRIMARY KEY确保这个列将包含唯一值,并且可以用来识别每一行。
  1. 其余的行定义了表中的其他列。

示例

让我们通过一个现实世界的例子来实践这一点。想象我们正在为一个小型图书馆创建数据库。我们想要跟踪书籍,每本书都应该有一个唯一的ID。

CREATE TABLE books (
book_id SERIAL PRIMARY KEY,
title VARCHAR(100) NOT NULL,
author VARCHAR(100) NOT NULL,
publication_year INTEGER
);

在这个例子中:

  • book_id是我们的自动递增列。它将自动为每本新书分配一个唯一的编号。
  • titleauthor是VARCHAR列,用于存储书籍的标题和作者名。
  • publication_year是INTEGER列,用于存储书籍出版的年份。

现在,让我们向表中添加一些书籍:

INSERT INTO books (title, author, publication_year)
VALUES ('杀死一只知更鸟', '哈珀·李', 1960);

INSERT INTO books (title, author, publication_year)
VALUES ('1984', '乔治·奥威尔', 1949);

INSERT INTO books (title, author, publication_year)
VALUES ('了不起的盖茨比', 'F. 斯科特·菲茨杰拉德', 1925);

注意,我们没有为book_id指定一个值。PostgreSQL将为我们自动生成这些值。如果我们现在查询我们的表:

SELECT * FROM books;

我们可能会看到如下内容:

book_id title author publication_year
1 杀死一只知更鸟 哈珀·李 1960
2 1984 乔治·奥威尔 1949
3 了不起的盖茨比 F. 斯科特·菲茨杰拉德 1925

如你所见,PostgreSQL已经自动为每一行分配了唯一的book_id值,从1开始,并为每个新条目递增1。

背后的原理

现在,你可能会问,“PostgreSQL怎么知道下一个要使用哪个数字?”好问题!在幕后,PostgreSQL使用一个序列来跟踪下一个可用的数字。

当你使用SERIAL数据类型时,PostgreSQL会自动为该列创建一个序列。序列就像一个计数器,它记住上一次给出的数字,并且知道在下次被要求时给出下一个数字。

实际上,你可以看到这个序列,如果你查看表详情:

\d books

这个命令将显示如下内容:

表 "public.books"
列       |          类型          | 校对   | 可空 |           默认
-----------------+------------------------+--------+------+------------------------------
book_id         | integer                |        | not null | nextval('books_book_id_seq'::regclass)
title           | character varying(100) |        | not null |
author          | character varying(100) |        | not null |
publication_year| integer                |        |          |
索引:
"books_pkey" PRIMARY KEY, btree (book_id)

看到那个nextval('books_book_id_seq'::regclass)部分了吗?那就是PostgreSQL使用序列来获取book_id的下一个值。

谨慎提示

虽然AUTO INCREMENT非常实用,但重要的是要记住,它不能保证没有间隔的连续数字。如果你插入一行然后删除它,那个数字不会被重用。这对于数据完整性来说实际上是个好事,但这是需要注意的。

例如,如果我们删除第二本书:

DELETE FROM books WHERE book_id = 2;

然后插入一本新书:

INSERT INTO books (title, author, publication_year)
VALUES ('傲慢与偏见', '简·奥斯汀', 1813);

我们的表可能会看起来像这样:

book_id title author publication_year
1 杀死一只知更鸟 哈珀·李 1960
3 了不起的盖茨比 F. 斯科特·菲茨杰拉德 1925
4 傲慢与偏见 简奥斯汀 1813

注意到book_id 2缺失,而新书获得了book_id 4。

结论

好了,各位!你刚刚学习了PostgreSQL中的AUTO INCREMENT。我们涵盖了它是什

Credits: Image by storyset