在本节中,无涯教程将了解 PostgreSQL Serial类型的工作方式,该类型可让无涯教程在表中定义自动增量列。
在PostgreSQL 中,无涯教程有一种称为 Serial 的特殊类型的数据库对象生成器,用于创建序列的整数(通常在表中用作主键)。
在创建新表时,可以在 SERIAL 类型的帮助下生成序列,如以下命令所示:
CREATE TABLE table_name(
ID SERIAL
);
如果无涯教程在 ID 列中提供 SERIAL类型,则PostgreSQL将执行以下操作:
CREATE TABLE table_name(
ID SERIAL
);
CREATE SEQUENCE table_name_ID_seq;
CREATE TABLE table_name (
ID integer NOT NULL DEFAULT nextval('table_name_ID_seq')
);
ALTER SEQUENCE table_name_ID_seq
OWNED BY table_name.ID;
PostgreSQL Serial类型已分为以下三种类型:
无涯教程有下表,其中包含PostgreSQL支持的所有 Serial类型规范:
| 名称 | 存储空间 | 范围 |
|---|---|---|
| SMALLSERIAL | 2个字节 | 1至32767 |
| SERIAL | 4个字节 | 1至2147483647 |
| BIGSERIAL | 8个字节 | 1至9223372036854775807 |
PostgreSQL Serial类型的语法如下:
variable_name SERIAL
无涯教程将在CREATE命令的帮助下创建一个新表,并使用 INSERT 命令插入一些值。
在下面的示例中,无涯教程使用 create 命令生成 cars 表。
CREATE TABLE Cars( Car_id SERIAL PRIMARY KEY, Car_name VARCHAR NOT NULL, Car_model VARCHAR NOT NULL );
执行上述命令后,已成功创建 Cars 表,如以下屏幕截图所示:

生成 Cars 表后,无涯教程可以使用INSERT命令在其中插入一些值。并且无涯教程可以在INSERT命令中使用 DEFAULT 关键字,或省略列名(Car_id)。
INSERT INTO Cars(Car_name, Car_model)
VALUES('Porche','911 Carrera');实施上述命令后,无涯教程将获得以下消息,并且该值已成功插入到 Cars 表中:

或使用具有列名(Car_id)的 DEFAULT关键字:
INSERT INTO Cars(Car_id, Car_name, Car_model) VALUES(DEFAULT,'Audi','A8');
在执行上述命令后,无涯教程将获得以下消息;该值已成功插入 Cars 表中:

正如无涯教程在上面的屏幕截图中看到的那样,PostgreSQL将两行插入 表中,其中 car_id 列值 1和1 2 。
创建和插入 cars 表的值后,无涯教程将使用 select 命令 cars 表:
SELECT * FROM Cars;
成功实现上述命令后,无涯教程将获得以下结果:

无涯教程可以使用 pg_get_serial_sequence()函数来获取指定表中 SERIAL 列的序列名称,如以下语法所示:
pg_get_serial_sequence('table_name','column_name')
要获取序列创建的当前值,无涯教程可以将序列名称传递给currval()函数。
在以下示例中,无涯教程使用 currval()函数返回由 Cars 表 Car_id_seq 产生的当前值>对象:
SELECT currval(pg_get_serial_sequence('Cars', 'car_id'));执行上述命令后,无涯教程将获得以下输出:

如果要在表中插入新行时获取序列创建的值,可以在INSERT命令中使用 RETURNING Car_id 子句。
以下命令用于在 Cars 表中插入新行,并返回为 Car_id 列生成的记录。
INSERT INTO Cars(Car_name,Car_model)
VALUES('Jaguar', 'XK')
RETURNING Car_id;执行上述命令后,无涯教程将获得以下输出,该输出将 Car_id 返回为 3 :

让无涯教程再看一个示例,以详细了解 Serial类型。
因此,无涯教程将在CREATE命令的帮助下,将另一个新表创建为 Vegetables 表,其中 Veg_id 列为 SERIAL 类型。
CREATE TABLE Vegetables( Veggie_id SERIAL PRIMARY KEY, Veggie_name VARCHAR NOT NULL, Veggie_seasons VARCHAR NOT NULL );
执行上述命令后,已成功创建 Vegetables 表,如以下屏幕截图所示:

生成 Vegetables 表后,无涯教程将使用INSERT命令在其中插入一些值,并省略 Veggies_id 列,如下面的命令:
INSERT INTO Vegetables(Veggie_name,Veggie_seasons)
VALUES('Broccoli','Spring');无涯教程将在执行上述命令时收到以下消息:该值已成功插入 Vegetables 表中。

或者,无涯教程也可以使用 Default 关键字并使用 Veggie_id 列,如以下命令所示:
INSERT INTO Vegetables (Veggie_id,Veggie_seasons, Veggie_seasons) VALUES(DEFAULT, 'Sweet Potatoes','Winter');
执行上述命令后,无涯教程将获得以下消息,该消息表明无涯教程可以使用 Default关键字或忽略列名,无涯教程将获得类似的输出:

因此,在以下命令的帮助下,无涯教程将为 cars 表添加更多值:
INSERT INTO Vegetables(Veggie_name,Veggie_seasons)
VALUES('Jalapeno Peppers','Fall'),
('Cucumbers','Summer'),
('Winter Squash','Winter'),
('Snow Peas','Spring'),
('Black Radish','All seasons'),
('Pumpkin','Fall');执行完上述命令后,无涯教程将获得以下消息,该消息显示该值已成功插入 Vegetables 表中。

创建并插入 Vegetables 表的值后,无涯教程将使用 SELECT 命令来返回 Vegetables 表的所有行:
SELECT * FROM Vegetables;
在成功实现上面的命令后,无涯教程将获得以下输出:
祝学习愉快!(内容编辑有误?请选中要编辑内容 -> 右键 -> 修改 -> 提交!)