侧边栏壁纸
  • 累计撰写 88 篇文章
  • 累计创建 41 个标签
  • 累计收到 4 条评论

目 录CONTENT

文章目录

PostgreSQL 字段默认值:含 Navicat,主键 ID 序列自增、创建时间、更新时间、字符串

勤为径苦作舟
2023-09-28 / 0 评论 / 0 点赞 / 67 阅读 / 0 字

自增

Generated Columns

不推荐,因为无法手动递增,指定下次生成的值。

分两种:

  • GENERATED ALWAYS AS IDENTITY
  • GENERATED BY DEFAULT AS IDENTITY

两者最主要的区别就是后者可以指定值,前者就算指定了值,也会忽略。

Navicat 中选择主键,设置虚拟类型即可。保存后,递增最小开始缓存都会变成 1,最大会变成 9223372036854775807(int8 有符号 64 位整数,最大长度 2^63-1)。

-- 全部默认
alter table "public"."table_name"
alter column "id" add generated always as identity;

-- 指定更多
alter table "public"."table_name"
alter column "id" add generated by default as identity (
  -- 递增,默认 1
  increment 1
  -- 最小,默认 1
  minvalue 1
  -- 最大,默认字段类型最大值
  maxvalue 9223372036854775807
  -- 开始,默认 1
  start 1
  -- 缓存,默认 1
  cache 1
);

序列(SEQUENCE)

创建序列,然后字段默认值为nextval('sequence_name'::regclass)

-- 全部默认
create sequence if not exists sequence_name
owned by "public"."table_name"."id";

-- 指定更多
create sequence if not exists sequence_name
-- 数据类型
as bigint
-- 递增,默认 1
increment by 1
-- 最小,未指定或 NO MINVALUE 时默认 1
minvalue 1
-- 最大,未指定或 NO MAXVALUE 时,升序序列默认为数据类型最大值,降序序列默认为 -1
maxvalue 9223372036854775807
-- 开始,升序序列默认为 minvalue,降序序列默认为 maxvalue
start with 1
-- 缓存,最小值和默认值都为 1
cache 1
-- 和表列关联,删除列或表时自动删除序列
owned by "public"."table_name"."id";

更新序列值:

-- 序列值从 1 开始
select setval('sequence_name', 1, false)
-- 序列值从 2 开始
select setval('sequence_name', 1, true);

自增整数类型

名称大小描述范围
smallserial、serial22 bytes自增短整数1 ~ 32767
serial、serial44 bytes自增整数1 ~ 2147483647
bigserial、serial88 bytes自增长整数1 ~ 9223372036854775807

实际上也是序列,保存后,类型会自动变成int2int4int8,默认值会变成nextval('table_column_seq'::regclass)

当前时间

用于timestamp类型的字段,默认值为CURRENT_TIMESTAMP,自动生成的值精确到小数点后 6 位(微秒)。

alter table "public"."table_name" 
  alter column "created_time" set default current_timestamp;

更新时间

和 MySQL 不一样,原生不支持,只能用触发器的方式实现。

-- 创建函数
create or replace function updated_time_trigger()
-- $$ 为豁免标识符(Dollar-Quoted String),一组之间的内容不会被转义。两个 $ 中间可以自定义内容。
returns trigger as $$
begin
  -- new 为正在被更新的行
  new.updated_time = current_timestamp;
  return new;
end;
$$ language plpgsql;

-- 创建触发器
create trigger updated_time_trigger
-- 在更新前触发
before update on "public"."table_name"
-- 针对每一行数据都执行
for each row
-- 调用的函数
execute function updated_time_trigger();

字符串

默认'xxx''xxx'::character varying

参考

0

评论区