PostgreSQL 串行
在本节中,我们将了解
PostgreSQL串行伪类型的工作,该伪类型允许我们定义
表格中的自动增加列。而且,我们还会看到
PostgreSQL串行伪类型的
示例。
什么是PostgreSQL串行伪类型?
在 PostgreSQL 中,我们有一种特殊的数据库对象生成器,称为
Serial ,它用于
创建整数序列,这些序列经常用作表中的
主键。
可以使用在创建新表时,
SERIAL伪类型的帮助,如以下命令所示:
CREATE TABLE table_name(
ID SERIAL
);
如果我们在
ID 列中提供
SERIAL伪类型,则PostgreSQL将执行以下操作:
首先,PostgreSQL将创建一个序列对象,然后将由序列创建的下一个值建立为特定列的预定义值。
在那之后,PostgreSQL将对 ID列增强 NOT NULL约束,因为序列始终会产生一个非空值的整数。 strong>。
最后,PostgreSQL将序列的所有者提供给 ID列;作为输出,当删除表或 ID列时,序列对象将被删除。
注意: 我们可以同时使用这两个命令来指定Serial伪类型,因为下面的命令彼此相似。
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串行伪类型已分为以下三种类型:
SMALLSERIAL
序列
BIGSERIAL
我们有下表,其中包含PostgreSQL支持的所有
Serial伪类型规范:
名称 |
存储空间 |
范围 |
SMALLSERIAL |
2个字节 |
1至32767 |
SERIAL |
4个字节 |
1至2147483647 |
BIGSERIAL |
8个字节 |
1至9223372036854775807 |
PostgreSQL串行伪类型的语法
PostgreSQL
串行伪类型的语法如下:
PostgreSQL SERIAL类型的示例
让我们看看不同的示例以了解
PostgreSQL串行伪类型如何工作。
注意: 我们可以为SERIAL列定义PRIMARY KEY约束,因为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 表:
或
DEFAULT关键字,其列名称为
(Car_id):
INSERT INTO Cars(Car_id, Car_name, Car_model)
VALUES(DEFAULT,'Audi','A8');
输出
在执行上述命令时,我们将收到以下消息;值已成功插入到
Cars 表中:
如上面的屏幕快照所示,PostgreSQL在
Cars 表中的
Car_id 列中插入了两行值是
1和2 。
创建并插入
Cars 表的值后,我们将使用
SELECT 命令返回
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 :
注意:
如上所述,序列生成器操作不是事务安全的,这意味着如果两个并行数据库尝试获取每个用户,则每个用户将获得不同的值序列中的下一个值。
如果一个用户可以回滚交易,该用户的序列号将处于空闲状态,并在序列中造成缺口。 Example2
让我们再看一个示例,以详细了解
Serial伪类型。
因此,我们将在CREATE命令的帮助下,将另一个新表创建为 Vegetables 表,并将其创建为类似的数据库 >组织,其中
Veg_id 列为
SERIAL 伪类型。
CREATE TABLE Vegetables(
Veggie_id SERIAL PRIMARY KEY,
Veggie_name VARCHAR NOT null,
Veggie_seasons VARCHAR NOT null
);
输出
执行上述命令后,已成功创建
蔬菜 表,如下面的屏幕截图:
一旦
蔬菜
表已生成,我们将使用INSERT命令在其中插入一些值,并省略 Veggies_id 列,如以下命令所示:
INSERT INTO Vegetables(Veggie_name,Veggie_seasons)
VALUES('Broccoli','Spring');
输出
我们将在执行上述命令时收到以下消息: 该值已成功插入
蔬菜 表。
或者,我们也可以使用
Default 关键字,并使用
Veggie_id 列,如以下命令所示:
INSERT INTO Vegetables (Veggie_id,Veggie_seasons, Veggie_seasons)
VALUES(DEFAULT, 'Sweet Potatoes','Winter');
输出
执行上述命令后,我们将得到以下消息,该消息表明我们可以使用
Default关键字或
忽略列名,我们将得到类似的输出:
p>因此,我们将通过以下命令在 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');
输出
执行上述命令后,我们将获得以下消息,该消息显示该值已成功插入
蔬菜中 表。
创建并插入
蔬菜表的值,我们将使用
SELECT 命令返回
蔬菜表的所有行:
SELECT *
FROM Vegetables;
输出
成功执行上述命令后,我们将获得以下输出:
PostgreSQL串行
在本节中,我们将了解
PostgreSQL串行伪类型的工作,该伪类型允许我们定义
表格中的自动增加列。而且,我们还会看到
PostgreSQL串行伪类型的
示例。
什么是PostgreSQL串行伪类型?
在 PostgreSQL 中,我们有一种特殊的数据库对象生成器,称为
Serial ,它用于
创建整数序列,这些序列经常用作表中的
主键。
可以使用在创建新表时,
SERIAL伪类型的帮助,如以下命令所示:
CREATE TABLE table_name(
ID SERIAL
);
如果我们在
ID 列中提供
SERIAL伪类型,则PostgreSQL将执行以下操作:
首先,PostgreSQL将创建一个序列对象,然后将由序列创建的下一个值建立为特定列的预定义值。 在那之后,PostgreSQL将对 ID列增强 NOT NULL约束,因为序列始终会产生一个非空值的整数。 strong>。 最后,PostgreSQL将序列的所有者提供给 ID列;作为输出,当删除表或 ID列时,序列对象将被删除。
注意: 我们可以同时使用这两个命令来指定Serial伪类型,因为下面的命令彼此相似。
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串行伪类型已分为以下三种类型:
SMALLSERIAL 序列 BIGSERIAL
我们有下表,其中包含PostgreSQL支持的所有
Serial伪类型规范:
名称 |
存储空间 |
范围 |
SMALLSERIAL |
2个字节 |
1至32767 |
SERIAL |
4个字节 |
1至2147483647 |
BIGSERIAL |
8个字节 |
1至9223372036854775807 |
PostgreSQL串行伪类型的语法
PostgreSQL
串行伪类型的语法如下:
PostgreSQL SERIAL类型的示例
让我们看看不同的示例以了解
PostgreSQL串行伪类型如何工作。
注意: 我们可以为SERIAL列定义PRIMARY KEY约束,因为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 表:
或
DEFAULT关键字,其列名称为
(Car_id):
INSERT INTO Cars(Car_id, Car_name, Car_model)
VALUES(DEFAULT,'Audi','A8');
输出
在执行上述命令时,我们将收到以下消息;值已成功插入到
Cars 表中:
如上面的屏幕快照所示,PostgreSQL在
Cars 表中的
Car_id 列中插入了两行值是
1和2 。
创建并插入
Cars 表的值后,我们将使用
SELECT 命令返回
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 :
注意:
如上所述,序列生成器操作不是事务安全的,这意味着如果两个并行数据库尝试获取每个用户,则每个用户将获得不同的值
序列中的下一个值。 如果一个用户可以回滚交易,该用户的序列号将处于空闲状态,并在序列中造成缺口。 Example2
让我们再看一个示例,以详细了解
Serial伪类型。
因此,我们将在CREATE命令的帮助下,将另一个新表创建为 Vegetables 表,并将其创建为类似的数据库 >组织,其中
Veg_id 列为
SERIAL 伪类型。
CREATE TABLE Vegetables(
Veggie_id SERIAL PRIMARY KEY,
Veggie_name VARCHAR NOT null,
Veggie_seasons VARCHAR NOT null
);
输出
执行上述命令后,已成功创建
蔬菜 表,如下面的屏幕截图:
一旦
蔬菜
表已生成,我们将使用INSERT命令在其中插入一些值,并省略 Veggies_id 列,如以下命令所示:
INSERT INTO Vegetables(Veggie_name,Veggie_seasons)
VALUES('Broccoli','Spring');
输出
我们将在执行上述命令时收到以下消息: 该值已成功插入
蔬菜 表。
或者,我们也可以使用
Default 关键字,并使用
Veggie_id 列,如以下命令所示:
INSERT INTO Vegetables (Veggie_id,Veggie_seasons, Veggie_seasons)
VALUES(DEFAULT, 'Sweet Potatoes','Winter');
输出
执行上述命令后,我们将得到以下消息,该消息表明我们可以使用
Default关键字或
忽略列名,我们将得到类似的输出:
p>因此,我们将通过以下命令在 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');
输出
执行上述命令后,我们将获得以下消息,该消息显示该值已成功插入
蔬菜中 表。
创建并插入
蔬菜表的值,我们将使用
SELECT 命令返回
蔬菜表的所有行:
SELECT *
FROM Vegetables;
输出
成功执行上述命令后,我们将获得以下输出:
概述
在
PostgreSQL串行伪指令中,类型部分,我们已经学习了串行伪类型功能,该功能主要用于为特定表创建
自动增加列值。