postgresql - 在 Postgresql 中创建生成的列时出错

标签 postgresql concatenation string-concatenation

CREATE TABLE Person (
   id  serial primary key,
   accNum  text UNIQUE GENERATED ALWAYS AS (
 concat(right(cast(extract year from current_date) as text), 2), cast(id as text)) STORED
);

错误:生成表达式不是不可变的

目标是用 YYid 填充 accNum 字段,其中 YY 是添加此人时年份的最后两个字母。

我也试过'||'运营商,但没有成功。

最佳答案

由于您不希望更新列,因此当行更改时,您可以定义自己的生成数字的函数:

create function generate_acc_num(id int)
returns text
as
$$
  select to_char(current_date, 'YY')||id::text;
$$
language sql
immutable; --<< this is lying to Postgres!

请注意,您应该切勿将此功能用于任何其他目的。 特别是不作为索引表达式。

然后你可以在生成的列中使用它:

CREATE TABLE Person 
(
  id  integer generated always as identity primary key,
  acc_num  text UNIQUE GENERATED ALWAYS AS (generate_acc_num(id)) STORED
);

关于postgresql - 在 Postgresql 中创建生成的列时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66474287/

相关文章:

.net - Linq 将复杂类型聚合成一个字符串

string - 在 Scala 中高效地重复字符/字符串 n 次

postgresql - 在管理员中使用 docker 我没有看到导入的数据

postgresql - PostGIS,可以从一些点创建多边形

javascript - 将字符串和变量连接成 Jade 的变量名

javascript - 在 JavaScript 中连接值?

r - 在R中的字符串中添加双引号

postgresql - 如何评估复合键?

sql - Rails 和 SQL 注入(inject) : Is this safe?

python通过给定开始和结束位置的两个列表连接子字符串