自增
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、serial2 | 2 bytes | 自增短整数 | 1 ~ 32767 |
serial、serial4 | 4 bytes | 自增整数 | 1 ~ 2147483647 |
bigserial、serial8 | 8 bytes | 自增长整数 | 1 ~ 9223372036854775807 |
实际上也是序列,保存后,类型会自动变成int2
、int4
或int8
,默认值会变成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
。
参考
- PostgreSQL: Documentation: 16: 5.3. Generated Columns
- PostgreSQL: Documentation: 16: CREATE TRIGGER
- PostgreSQL: Documentation: 16: 39.1. Overview of Trigger Behavior
- PostgreSQL: Documentation: 16: 4.1. Lexical Structure - Dollar-Quoted String Constants
- PostgreSQL: Documentation: 16: 8.1. Numeric Types
评论区