PostgreSQL 串行


PostgreSQL 串行

在本节中,我们将了解PostgreSQL Serial伪类型的工作原理,它允许我们在表中定义增列。我们还看到了PostgreSQL Serial 伪类型的**例子**。

什么是 PostgreSQL 串行伪类型?

在PostgreSQL 中,我们有一种特殊的数据库对象生成器,称为Serial,用于创建经常用作表中主键**的整数序列**。

序列可以在SERIAL pseudo-type的帮助下生成,同时我们正在创建一个新表,我们可以在以下命令中看到:

CREATE TABLE table_name(  
    ID SERIAL  
);

如果我们为ID列提供SERIAL pseudo-type,PostgreSQL 会执行以下操作:

  • 首先,PostgreSQL 将创建一个序列对象,然后将序列创建的下一个值建立为特定列的预定义值。
  • 之后,PostgreSQL 将增强对ID 列NOT NULL 约束,因为序列总是产生一个非空值的整数。
  • 最后,PostgreSQL 会将序列的所有者提供给ID 列;作为输出,删除表或ID 列时删除序列对象。

注意:我们可以使用这两个命令来指定 SERIAL pseudo-type,因为下面的两个命令彼此相似。

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
  • SERIAL
  • BIGSERIAL

我们有下表,其中包含PostgreSQL 支持的所有Serial 伪类型规范:

名称 存储大小 范围
SMALLSERIAL 2 bytes 1 至 32767
SERIAL 4 bytes 1 至 2147483647
BIGSERIAL 8 bytes 1 至 9223372036854775807

PostgreSQL Serial SERIAL pseudo-type的语法

PostgreSQL SERIAL pseudo-type的语法如下:

variable_name SERIAL

PostgreSQL SERIAL 类型示例

让我们看不同的例子来理解PostgreSQL Serial 伪类型是如何工作的

注意:我们可以为 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表已经创建成功,如下图所示:

PostgreSQL 串行

一旦汽车\表已经产生,我们可以插入使用INSERT命令一些值。我们可以在 INSERT 命令中使用DEFAULT关键字或省略列名(Car_id)

INSERT INTO Cars(Car_name, Car_model)   
VALUES('Porche','911 Carrera');

输出

执行完上面的命令后,我们会得到如下信息,值已经成功插入到Cars\表中:

PostgreSQL 串行

使用带有列名(Car_id)DEFAULT 关键字**:**

INSERT INTO Cars(Car_id, Car_name, Car_model)   
VALUES(DEFAULT,'Audi','A8');

输出

执行上述命令后,我们将收到以下消息;该值已成功插入到Cars\表中:

PostgreSQL 串行

正如我们在上面的屏幕截图中看到的,PostgreSQL 在Cars\表中插入了两行,其中Car_id列值为1 和 2

创建并插入Cars表的值后,我们将使用SELECT命令返回Cars表的所有行:

SELECT * FROM Cars;

输出

成功执行上述命令后,我们将得到如下结果:

PostgreSQL 串行

我们可以使用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'));

输出

执行上述命令后,我们将得到以下输出:

PostgreSQL 串行

如果我们想在向表中插入新行时获取序列创建的那些值,我们可以在 INSERT 命令中使用RETURNING Car_id子句。

下面的命令用于在Cars表中插入一个新行并返回为Car_id列生成的那些记录。

INSERT INTO Cars(Car_name,Car_model)   
VALUES('Jaguar', 'XK')  
RETURNING Car_id;

输出

在执行上述命令时,我们将得到以下输出,它将Car_id返回为3

PostgreSQL 串行

笔记:

  • 正如我们上面所理解的,序列生成器操作不是事务安全的,这意味着如果两个并行数据库连接尝试从序列中获取下一个值,每个用户将获得不同的值。
  • 如果一个用户可以回滚事务,那么该用户的序列号将处于空闲状态并在序列中产生间隙。

例2

让我们再看一个例子来详细了解Serial 伪类型

因此,我们将在 CREATE 命令的帮助下创建另一个新表作为蔬菜\表到类似的数据库中,该数据库组织,其中Veg_id列作为SERIAL伪类型。

CREATE TABLE Vegetables(  
     Veggie_id SERIAL PRIMARY KEY,  
    Veggie_name VARCHAR NOT NULL,  
Veggie_seasons VARCHAR NOT NULL  
);

输出

执行上述命令后,Vegetables\表已经创建成功,如下图所示:

PostgreSQL 串行

一旦蔬菜\表已经生成,我们将使用INSERT命令插入一些值,并省略Veggies_id柱如图中下面的命令:

INSERT INTO Vegetables(Veggie_name,Veggie_seasons)   
VALUES('Broccoli','Spring');

输出

执行上述命令后,我们将收到以下消息:该值已成功插入到Vegetables\表中。

PostgreSQL 串行

或者,我们也可以使用Default关键字并使用Veggie_id列,如以下命令所示:

INSERT INTO Vegetables (Veggie_id,Veggie_seasons, Veggie_seasons)   
VALUES(DEFAULT, 'Sweet Potatoes','Winter');

输出

执行上述命令后,我们将得到以下消息,说明我们可以使用Default 关键字忽略列名,我们将得到类似的输出:

PostgreSQL 串行

因此,我们将在以下命令的帮助下向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\表中。

PostgreSQL 串行

创建并插入Vegetables表的值后,我们将使用SELECT命令返回Vegetables表的所有行:

SELECT *   
FROM Vegetables;

输出

成功执行上述命令后,我们将得到以下输出:

PostgreSQL 串行

概述

PostgreSQL Serial 伪类型部分,我们学习了 Serial 伪类型功能,该功能主要用于为特定表创建自动增加的列值。