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,
...
);
让我们分解这个语法:
-
CREATE TABLE table_name
: 这部分创建了一个名为你指定的新表。 -
column_name SERIAL PRIMARY KEY
: 这就是魔法发生的地方!
-
column_name
是你想要给自动递增列的名字。 -
SERIAL
是PostgreSQL特有的数据类型,用于创建自动递增的整数列。 -
PRIMARY KEY
确保该列将包含唯一值,并可用于标识每一行。
- 剩余的行定义表中的其他列。
示例
让我们通过一个现实世界的例子来实践这一点。假设我们正在为一个小图书馆创建数据库。我们想要跟踪图书,每本书应该有一个唯一的ID。
CREATE TABLE books (
book_id SERIAL PRIMARY KEY,
title VARCHAR(100) NOT NULL,
author VARCHAR(100) NOT NULL,
publication_year INTEGER
);
在这个例子中:
-
book_id
是我们的自动递增列。它将自动为每本新书分配一个唯一的数字。 -
title
和author
是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