首页 > 数据库 >postgresql/lightdb中覆盖自增列值

postgresql/lightdb中覆盖自增列值

时间:2023-01-05 09:45:09浏览次数:55  
标签:postgresql lightdb 增列 generated time c2 c1 select postgres

  PostgreSQL里的自动生成标识列identity column和自动生成存储列generated column是非常不错的功能,不过他们的实现语法比较近似,容易弄混,本文将进行示例介绍。

PG v10 : identity column

  PostgreSQL v10 版本引入了identity column, 功能和 serial 很像,它是对SQL兼容性的提升,并且修复了 serial 类型存在的以下问题:

  1. CREATE TABLE / LIKE 命令复制表时指定相同的序列
  2. 不能使用 ALTER TABLE 增加或删除 serialness
  3. 表删除 default 属性时不会删除序列
  4. 需要对序列进行额外赋权

  常见的使用场景是自动生成主键序列,有两种使用形式

  • generated always as identity声明的字段,用户不能显式赋值插入,否则会报错。
  • generated by default as identity声明的字段,用户可以覆盖系统的赋值,手工插入

声明之后insert语句也可以通过以下方式来覆盖上述限制:

  • overriding system value
  • overriding user value

  使用overriding system value为generated always的标识列指定显式值

postgres=# create table gen1(
postgres(# c1 int generated always as identity,
postgres(# c2 varchar(10)
postgres(# );
CREATE TABLE
postgres=# 
postgres=# insert into gen1 (c2) values('data1');
INSERT 0 1
postgres=# 
postgres=# select * from gen1;
 c1 |  c2   
----+-------
  1 | data1
(1 row)

postgres=# insert into gen1 
postgres-# overriding system value              
postgres-# values (100, 'data2') ;
INSERT 0 1
postgres=# select * from gen1;
 c1  |  c2   
-----+-------
   1 | data1
 100 | data2
(2 rows)

  使用overriding user value为generated by default的标识列提供的任何值都将被忽略,并使用默认的序列生成值:

postgres=# create table gen2(
postgres(# c1 int generated by default as identity,
postgres(# c2 varchar(10)
postgres(# );
CREATE TABLE
postgres=# insert into gen2 (c2) values('data1');
INSERT 0 1
postgres=# select * from gen2;
 c1 |  c2   
----+-------
  1 | data1
(1 row)

postgres=# insert into gen2 
postgres-# overriding user value 
postgres-# values (100, 'data2') ;
INSERT 0 1
postgres=# select * from gen2;
 c1 |  c2   
----+-------
  1 | data1
  2 | data2
(2 rows

  使用overriding user value为generated always的标识列忽略用户指定的显式值,并使用默认的序列生成值(PG v13开始支持):

postgres=# create table gen3(
postgres(# c1 int generated always as identity,
postgres(# c2 varchar(10)
postgres(# );
CREATE TABLE
postgres=# insert into gen3 (c2) values('data1');
INSERT 0 1
postgres=# select * from gen3;
 c1 |  c2   
----+-------
  1 | data1
(1 row)

postgres=# insert into gen3 
postgres-# overriding user value 
postgres-# values (100, 'data2') ;
INSERT 0 1
postgres=# select * from gen3;
 c1 |  c2   
----+-------
  1 | data1
  2 | data2
(2 rows)

PG v12 : generated column

  PostgreSQL v12 版本引入了generated column的功能,支持自动生成字段的值。

  • 基于当前表的当前行的其他列
  • 基于表达式或者immutable函数

  示例一:创建表gen4,c3列自动做加法运算

postgres=# create table gen4(
postgres(# c1 int, 
postgres(# c2 int, 
postgres(# c3 int generated always as (c1 + c2) stored
postgres(# );
CREATE TABLE
postgres=# insert into gen4 values(100,200);
INSERT 0 1
postgres=# select * from gen4;
 c1  | c2  | c3  
-----+-----+-----
 100 | 200 | 300
(1 row)

postgres=# update gen4 set c2=c2+1 where c1=100;
UPDATE 1
postgres=# select * from gen4;
 c1  | c2  | c3  
-----+-----+-----
 100 | 201 | 301
(1 row)

示例二:自动更新时间戳
首先创建一个immutable函数

create or replace function im_now () returns timestamptz as $$  
  select CURRENT_TIMESTAMP;  
$$ language sql  immutable;  

接着创建表gen5

create table gen5(
id int primary key, 
info text, 
crt_time timestamp, 
mod_time timestamp GENERATED ALWAYS AS ( im_now() ) stored
);  

接着进行下面的测试:

postgres=# insert into gen5 values(1,'aaa',now());
INSERT 0 1
postgres=# select * from gen5;
 id | info |          crt_time          |          mod_time          
----+------+----------------------------+----------------------------
  1 | aaa  | 2022-04-27 12:55:09.247823 | 2022-04-27 12:55:09.247823
(1 row)
postgres=# update gen5 set info='bbb' where id=1;
UPDATE 1
postgres=# select * from gen5;
 id | info |          crt_time          |          mod_time          
----+------+----------------------------+----------------------------
  1 | bbb  | 2022-04-27 12:55:09.247823 | 2022-04-27 12:55:09.247823
(1 row)

从上面可以看到,insert自动生成了数据,update时mod_time并没有更新时间戳。

我们再修改一下上面的函数定义:

create or replace function im_now (text) returns timestamptz as $$  
  select current_timestamp;  
$$ language sql  
immutable parallel safe; 

接着创建表gen6

create table gen6(
id int primary key, 
info text, 
crt_time timestamp, 
mod_time timestamp GENERATED ALWAYS AS (im_now(info)) stored
);  

然后进行下面的测试:

postgres=# insert into gen6 values(1,'aaa',now());
INSERT 0 1
postgres=# 
postgres=# select * from gen6;
 id | info |          crt_time          |          mod_time          
----+------+----------------------------+----------------------------
  1 | aaa  | 2022-04-27 18:53:10.361791 | 2022-04-27 18:53:10.361791
(1 row)
postgres=# update gen6 set info='bbb' where id=1;
UPDATE 1
postgres=# select * from gen6;
 id | info |          crt_time          |          mod_time          
----+------+----------------------------+----------------------------
  1 | bbb  | 2022-04-27 18:53:10.361791 | 2022-04-27 18:53:48.498064
(1 row)

  可以看到对info列的修改会自动更新mod_time,如果其它字段也希望触发更新,可以修改im_now函数的定义。

  在lightdb中,还支持auto_increment自增列定义。

标签:postgresql,lightdb,增列,generated,time,c2,c1,select,postgres
From: https://www.cnblogs.com/lightdb/p/17026627.html

相关文章

  • PostgreSQL远端访问
    PostgreSQL默认的理念是运行在本地地址且不允许外部访问的。如果想通过NavicatforpostgreSql这种优秀的第三方软件访问需要做出如下修改:一、启动在外部可访问的地址上......
  • postgresql_anonymizer使用
     瀚高数据库目录环境文档用途详细信息  环境系统平台:Linuxx86-64RedHatEnterpriseLinux7版本:12 文档用途postgresql_anonymizer是对数据库中的个人识别信息或商业......
  • Postgresql分析慢sql
    Postgresql分析慢sqli查拉图斯特拉如是说2022年12月20日21:06 ·  阅读446开启掘金成长之旅!这是我参与「掘金日新计划·12月更文挑战」的第1天,点击查看......
  • PostgreSQL源码结构
    PostgreSQL源码结构  5440 次浏览      6 2019-9-6 编辑推荐:本文来自于csdn,本文主要介绍了PostgreSQL......
  • PostgreSQL死锁了怎么办?
    PostgreSQL死锁了怎么办?慕枫技术笔记2022年05月27日00:17 ·  阅读638持续创作,加速成长!这是我参与「掘金日新计划·6月更文挑战」的第1天,点击查看活动详......
  • Oracle转PostgreSQL
    Oracle转PostgreSQLOracle postgresql oracle sql 数据库 最近在做一些OracleSQL转PostgreSQL的工作,顺便记录这些改变,以便以后再转换有个参考。描述OracleP......
  • PostgreSQL动态SQL(兼容oracle DBMS_SQL)
    PostgreSQL动态SQL(兼容oracleDBMS_SQL)PostgreSQL sql 数据库 postgresql oracle中的dbms_sql包可以用来执行动态SQL,让我们在存储过程的动态SQL中使用prepared......
  • postgresql windows 开发环境搭建
    postgresqlwindows开发环境搭建发布时间:2020-06-2912:45:05 来源:网络 阅读:2883 作者:pgmia 栏目:数据库一、软件需求Windows7旗舰版sp1X64ActivePerl-5.......
  • PostgreSQL兼容oracle rman备份——pg_rman
    PostgreSQL兼容oraclerman备份——pg_rmanPostgreSQL sql 数据库 postgresql 0、说明PostgreSQL支持多种备份数据的方式,如:SQL转储、文件系统级备份、连续归档。......
  • PostgreSQL citus python环境搭建
    PostgreSQLcituspython环境搭建 精选 原创Janeh10182022-01-0809:19:09博主文章分类:PostgreSQL©著作权文章标签sqlpostgresql数据库文章分类其它数据库阅读数27......