PostgreSQL - AUTO INCREMENT

Привет,野心勃勃的数据库爱好者们!今天,我们将深入了解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 ('Убить пересмешника', 'Harper Lee', 1960);

INSERT INTO books (title, author, publication_year)
VALUES ('1984', 'George Orwell', 1949);

INSERT INTO books (title, author, publication_year)
VALUES ('Великий Гэтсби', 'F. Scott Fitzgerald', 1925);

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

SELECT * FROM books;

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

book_id title author publication_year
1 Убить пересмешника Harper Lee 1960
2 1984 George Orwell 1949
3 Великий Гэтсби F. Scott Fitzgerald 1925

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

背后的原理

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

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

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

\d books

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

Table "public.books"
Column      |          Type          | Collation | Nullable |           Default
-----------------+------------------------+-----------+----------+------------------------------
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                |           |          |
Indexes:
"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 ('Гордость и предубеждение', 'Jane Austen', 1813);

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

book_id title author publication_year
1 Убить пересмешника Harper Lee 1960
3 Великий Гэтсби F. Scott Fitzgerald 1925
4 Гордость и предубеждение Jane Austen 1813

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

结论

就这样,朋友们!您刚刚了解了PostgreSQL中的AUTO INCREMENT。我们介绍了它的作用、如何使用它,甚至窥探了它的工作原理。记住,AUTO INCREMENT就像一个有用的图书管理员,自动为新到达的每本书分配一个唯一的编号,节省了你自己跟踪的麻烦。

随着您在数据库世界的旅程继续,您会发现AUTO INCREMENT是一个值得信赖的伴侣,在您需要分配唯一标识符时,让生活变得更轻松。继续练习,保持好奇心,不久您将成为PostgreSQL的专家!

快乐编码,愿您的查询总是返回您期望的结果!

Credits: Image by storyset