【问题标题】:How to autofill column based on Serial Primary Key in Postgresql?如何根据 Postgresql 中的串行主键自动填充列?
【发布时间】:2019-08-08 15:44:57
【问题描述】:

我有一个包含如下列的表格:

inner_id(serial pk) | id(varchar) | name(varchar) | fid(varchar) 

我想发送只有 id 和 name 的行:(id, name) 我怎么能告诉 Postgresql 用基于串行 pk 的值(如字符串 + 主键)来完成“fid”列? 我想要这种输出:

inner_id(serial pk) | id(varchar) | name(varchar) | fid(varchar)
         1               G786k          NAME           FID-1
         2               l7hk           NAME           FID-2

作为奖励,我从 python 发送行并且必须在查询中使用 %s

UPD。 我尝试运行如下查询:

INSERT INTO table (id, name, fid)
VALUES (%s,%s,%s||TO_CHAR(inner_id));

但是我得到一个错误,我不能引用 inner_id(primary key)

【问题讨论】:

  • Postgres 12 引入了计算列。我建议只使用视图来执行此操作。
  • 为什么要两次存储相同的信息?当您选择数据时,这样做会更好。或者按照 Gordon 的建议创建一个视图
  • 嗯,我需要这个来解决我当前的现有问题!目前搜索有关计算列的信息

标签: sql postgresql


【解决方案1】:

由于你的inner_id是一个序列,你可以获取序列的名称并使用Nextval

所以应该是这样的

INSERT INTO TABLE ("id","name","fid")
VALUES (your_id, 'some_name', 'FID-' || nextval('your_sequence_id') - 1);

【讨论】:

  • 不起作用。有错误,我不能引用主键。 ...值 (%s,%s,%s||curval(inner_id));
  • 您需要使用的不是inner id,而是inner_id 序列。 PostgreSQL 在你使用序列时生成一个序列
  • 请您澄清一下。我不明白如何调用序列而不是列“内部 id”。 postgresql生成的inner_id序列是否与列inner_id不同
  • 我想我在 pgAdmin 中找到了序列。
  • 好的,谢谢!你的决定对我来说已经足够好了。
【解决方案2】:

如果您将 inner_id 定义为 'serial',Postgres 将为它生成序列。通常类似于“table_name_column_name-seq”。然后,您可以使用该序列的 currval 设置“fid”列的默认值。

create table soq.ref_to_id( inner_id serial, id text, name text, fid text);

alter table soq.ref_to_id alter column fid set default 'FID-' || currval('soq.ref_to_id_inner_id_seq')::text;

-- insert tast data    
insert into soq.ref_to_id(id, name)  
   values ('G786k', 'Gname')
        , ('17hk',  '17NAME');  

-- check results  
select * from soq.ref_to_id;

【讨论】:

    猜你喜欢
    • 2015-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-04
    • 1970-01-01
    • 2022-09-30
    • 2022-12-17
    • 1970-01-01
    相关资源
    最近更新 更多