PL/pgSQL 重新启动生成的序列
PL/pgSQL restart generated sequence
我有一个在 Spring 引导应用程序启动时使用的初始化脚本,如果 table 不存在,我会创建它。然后我从 table 中删除所有数据并执行一系列插入操作。
create table if not exists employee (
id serial primary key,
name varchar(255)
);
delete from employee;
-- inserts
每次执行脚本时,序列仍然继续,因此新行不会从一开始。我也必须重置这样的序列,但是,它是生成的,除非我调用这个脚本,否则我不知道它的名字:
select pg_get_serial_sequence('employee', 'id');
-- returns public.employee_id_seq
我尝试将其组合在一起并根据此函数的输出重置序列,但没有成功。如何在不知道其名称的情况下重置生成的序列?到目前为止,我的尝试无法解析变量中的 seq
序列:
do $$
declare
seq varchar(255);
begin
select pg_get_serial_sequence('employee', 'employee_id') into seq;
alter sequence seq restart with 1;
end; $$;
将 id serial 重置为任何数字基本上是一个坏主意,因此您必须非常小心地使用以下内容。
尤其是当您有指向 id firld 的外键时
您要找的是
ALTER SEQUENCE <table_name>_<id_column>_seq RESTART WITH 1
create table if not exists employee (
id serial primary key,
name varchar(255)
);
INSERT INTO employee (name) VALUES ('a'),('B'),('C')
3 rows affected
delete from employee;
3 rows affected
ALTER SEQUENCE employee_id_seq RESTART WITH 1
INSERT INTO employee (name) VALUES ('a')
1 rows affected
SELECT * FROM employee
id | name
-: | :---
1 | a
db<>fiddle here
最简单的解决方案是使用 truncate table . . . restart identity
而不是 delete
:
truncate table employee restart identity;
Here 是一个 db<>fiddle.
Truncate table
也出于其他原因被推荐。例如,它回收立即使用的 space 和 table。而且速度要快得多。一个区别是不会调用 delete
触发器(尽管您的 table 没有任何触发器)。
我有一个在 Spring 引导应用程序启动时使用的初始化脚本,如果 table 不存在,我会创建它。然后我从 table 中删除所有数据并执行一系列插入操作。
create table if not exists employee (
id serial primary key,
name varchar(255)
);
delete from employee;
-- inserts
每次执行脚本时,序列仍然继续,因此新行不会从一开始。我也必须重置这样的序列,但是,它是生成的,除非我调用这个脚本,否则我不知道它的名字:
select pg_get_serial_sequence('employee', 'id');
-- returns public.employee_id_seq
我尝试将其组合在一起并根据此函数的输出重置序列,但没有成功。如何在不知道其名称的情况下重置生成的序列?到目前为止,我的尝试无法解析变量中的 seq
序列:
do $$
declare
seq varchar(255);
begin
select pg_get_serial_sequence('employee', 'employee_id') into seq;
alter sequence seq restart with 1;
end; $$;
将 id serial 重置为任何数字基本上是一个坏主意,因此您必须非常小心地使用以下内容。
尤其是当您有指向 id firld 的外键时
您要找的是
ALTER SEQUENCE <table_name>_<id_column>_seq RESTART WITH 1
create table if not exists employee ( id serial primary key, name varchar(255) );
INSERT INTO employee (name) VALUES ('a'),('B'),('C')
3 rows affected
delete from employee;
3 rows affected
ALTER SEQUENCE employee_id_seq RESTART WITH 1
INSERT INTO employee (name) VALUES ('a')
1 rows affected
SELECT * FROM employee
id | name -: | :--- 1 | a
db<>fiddle here
最简单的解决方案是使用 truncate table . . . restart identity
而不是 delete
:
truncate table employee restart identity;
Here 是一个 db<>fiddle.
Truncate table
也出于其他原因被推荐。例如,它回收立即使用的 space 和 table。而且速度要快得多。一个区别是不会调用 delete
触发器(尽管您的 table 没有任何触发器)。