PostgreSQL串行-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表已经创建成功,如下图所示:
一旦汽车表已经产生,我们可以插入使用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 在Cars表中插入了两行,其中Car_id列值为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:
笔记:
- 正如我们上面所理解的,序列生成器操作不是事务安全的,这意味着如果两个并行数据库连接尝试从序列中获取下一个值,每个用户将获得不同的值。
- 如果一个用户可以回滚事务,那么该用户的序列号将处于空闲状态并在序列中产生间隙。
例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表已经创建成功,如下图所示:
一旦蔬菜表已经生成,我们将使用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;
输出
成功执行上述命令后,我们将得到以下输出:
概述
在PostgreSQL Serial 伪类型部分,我们学习了 Serial 伪类型功能,该功能主要用于为特定表创建自动增加的列值。
相关文章:
- [PostgreSQL教程]PostgreSQL特性-PostgreSQL教程|
- [PostgreSQL教程]PostgreSQL版本-PostgreSQL教程|
- [PostgreSQL教程]PostgreSQL语法-PostgreSQL教程|
- [PostgreSQL教程]PostgreSQL序列-PostgreSQL教程|
- [PostgreSQL教程]PostgreSQL数字-PostgreSQL教程|
- [PostgreSQL教程]PostgreSQL字符-PostgreSQL教程|
- [PostgreSQL教程]PostgreSQL文本-PostgreSQL教程|
- [PostgreSQL教程]PostgreSQL变量-PostgreSQL教程|
- [PostgreSQL教程]PostgreSQL整数-PostgreSQL教程|
- [PostgreSQL教程]PostgreSQL日期-PostgreSQL教程|
相关推荐:
- [PostgreSQL教程]PostgreSQL与SQLite-PostgreSQL教程|
- [PostgreSQL教程]MongoDB与PostgreSQL-PostgreSQL教程|
- [PostgreSQL教程]psqlcommands-PostgreSQL教程|
- [PostgreSQL教程]PostgreSQLDate&TimeFunction-PostgreSQL教程|
- [PostgreSQL教程]PostgreSQLFunctions-PostgreSQL教程|
- [PostgreSQL教程]PostgreSQLMulti-columnIndexes-PostgreSQL教程|
- [PostgreSQL教程]PostgreSQL禁用触发器-PostgreSQL教程|
- [PostgreSQL教程]PostgreSQL左连接-PostgreSQL教程|
- [PostgreSQL教程]PostgreSQLANDCondition-PostgreSQL教程|
- [PostgreSQL教程]PostgreSQL获取子句-PostgreSQL教程|
- PostgreSQL与SQLite-PostgreSQL教程|
- PostgreSQL与Oracle-PostgreSQL教程|
- PostgreSQL与MariaDB-PostgreSQL教程|
- PostgreSQL与SQLServer-PostgreSQL教程|
- MongoDB与PostgreSQL-PostgreSQL教程|
- PostgreSQLEXCEPT-PostgreSQL教程|
- PostgreSQLINTERSECT-PostgreSQL教程|
- PostgreSQLUnion-PostgreSQL教程|
- psqlcommands-PostgreSQL教程|
- PostgreSQLDate&TimeFunction-PostgreSQL教程|
- PostgreSQL删除触发器-PostgreSQL教程|
- PostgreSQLOrderby子句-PostgreSQL教程|
- PostgreSQL与SQLite-PostgreSQL教程|
- PostgreSQLINTERSECT-PostgreSQL教程|
- PostgreSQLAlias-PostgreSQL教程|
- PostgreSQLNot-NullConstraint-PostgreSQL教程|
- PostgreSQL与MariaDB-PostgreSQL教程|
- PostgreSQLUnion-PostgreSQL教程|
- PostgreSQLMulti-columnIndexes-PostgreSQL教程|
- PostgreSQL左连接-PostgreSQL教程|