serial:序列号类型其实不是真正的类型,当声明一个字段为序列号类型时其实是创建了一个序列,INSERT时如果没有给该字段赋值会默认获取对应序列的下一个值。
在有些需要用到一个自增字段来进行排序或通过拖拉行数改变排序的场景,除了建表时的id(主键)也可以定义一个自增的字段来使用。
建表sql:
create table t_test1
(
id serial not null,
name varchar(32),
p_order serial not null,
data varchar(32)
);```
插入模拟数据:
```sql
insert into t_test1 (
name,
data
)values (
'test1335',
'beantest'
);
表中数据,并没有去插入id和p_order这两个字段:
id name p_order data
1 test1333 1 beantest
2 test1334 2 beantest
3 test1335 3 beantest
使用pg_get_serial_sequence函数可以获得serial列的序列名称:
pg_get_serial_sequence('table_name','column_name')
同时需要注意的是:
序列生成器不是事务安全的。意味着如果两个并发数据库连接尝试从序列中获取下一个值,每个客户端获得不同的值。如果一个客户端回滚事务,则该序列值将被弃用,导致序列值不连续。