PostgreSQL 串行 PostgreSQL BIGINT 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 BIGINT PostgreSQL 日期