PostgreSQL - 自动递增
你好,有抱负的数据库爱好者们!今天,我们将深入了解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 ('杀死一只知更鸟', '哈珀·李', 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