标签: database-sequence

如何在postgres不同步时重置postgres的主键序列?

我遇到了我的主键序列与我的表行不同步的问题.

也就是说,当我插入一个新行时,我得到一个重复的键错误,因为串行数据类型中隐含的序列返回一个已经存在的数字.

这似乎是由导入/恢复不能正确维护序列引起的.

postgresql primary-key database-sequence

482
推荐指数
17
解决办法
23万
查看次数

Postgres手动改变序列

我正在尝试将序列设置为特定值.

SELECT setval('payments_id_seq'), 21, true
Run Code Online (Sandbox Code Playgroud)

这给出了一个错误:

ERROR: function setval(unknown) does not exist

使用ALTER SEQUENCE似乎也不起作用?

ALTER SEQUENCE payments_id_seq LASTVALUE 22
Run Code Online (Sandbox Code Playgroud)

如何才能做到这一点?

参考:https://www.postgresql.org/docs/current/static/functions-sequence.html

postgresql database-sequence

149
推荐指数
5
解决办法
14万
查看次数

序列不受交易影响?

我有一张桌子

create table testtable(
  testtable_rid serial not null,
  data integer not null,
  constraint pk_testtable primary key(testtable_rid)
);
Run Code Online (Sandbox Code Playgroud)

所以我要说这个代码约20次:

begin;
insert into testtable (data) values (0);
rollback;
Run Code Online (Sandbox Code Playgroud)

然后我做

begin;
insert into testtable (data) values (0);
commit;
Run Code Online (Sandbox Code Playgroud)

最后一个

select * from testtable
Run Code Online (Sandbox Code Playgroud)
Result:
row0: testtable_rid=21 | data=0
Expected result:
row0: testtable_rid=1 | data=0

如您所见,序列似乎不受事务回滚的影响.它们继续递增,就好像提交了事务一样,然后删除了该行.有没有办法防止序列以这种方式表现?

postgresql transactions rollback database-sequence

28
推荐指数
2
解决办法
1万
查看次数

为什么整数变量不被接受为START WITH的值

我正在尝试为序列创建动态起始编号,但它不接受变量即.@START_SEQSTART WITH.请考虑以下代码: -

CREATE PROCEDURE  [dbo].[SP_RESET_SEQ]
AS
DECLARE @START_SEQ INT =0;

BEGIN
SET @START_SEQ = (SELECT MAX(USER_ID)+1 FROM MASTER_USER);
IF OBJECT_ID('SEQ_USER_ID') IS NOT NULL
DROP SEQUENCE [dbo].[SEQ_USER_ID]

CREATE SEQUENCE [dbo].[SEQ_USER_ID] 
 AS [bigint]
 START WITH @START_SEQ
 INCREMENT BY 1
 MINVALUE 1
 MAXVALUE 99999999
 CACHE 
END
Run Code Online (Sandbox Code Playgroud)

t-sql sql-server database-sequence

8
推荐指数
1
解决办法
4900
查看次数

将自动增量列添加到按日期排序的现有表中

我在数据库中有一个名为“tickets”的现有表,其中包含以下列:

id (string, Primary Key, contains UUID like e6c49164-545a-43a1-845f-73c5163962f2) 
date   (biginteger, stores epoch)
status (string)
Run Code Online (Sandbox Code Playgroud)

我需要添加新的自动增量列ticket_id但要生成的值应该根据“日期”列值。

我试过这个:

ALTER TABLE "tickets" ADD COLUMN "ticket_id" SERIAL;
Run Code Online (Sandbox Code Playgroud)

问题是,它以某种奇怪的顺序生成“ticket_id”值,看起来它基于“id”列,它是表的主键。

是否可以生成根据“日期”排序的序列值?这很重要,因为“ticket_id”需要根据票的生成顺序显示。

postgresql ddl sql-update database-sequence

7
推荐指数
1
解决办法
4396
查看次数

序列存在时不存在 - Postgres/Spring Boot

我正在编写一个 Spring Boot web 应用程序并使用 Postgres 数据库来保存我的数据。我使用 Postgres 创建了一个表,create table user (id bigserial primary key not null, name text not null;sequence_name通过查看模式(在本例中为user_id_seq)来识别它。然后,在UserSpring Boot 的实体类中,我添加了以下内容:

@Entity
@Table(name = "user")
public class User implements Serializable {

    @Id
    @SequenceGenerator(name = "user_local_seq", sequenceName = "user_id_seq", allocationSize = 1)
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "user_local_seq")
    private Long id;
...
Run Code Online (Sandbox Code Playgroud)

确保sequenceName与我之前看到的相匹配。现在,当我启动 Spring Boot 应用程序时,我能够成功启动它,但在跟踪中出现以下“错误”:

main] org.hibernate.tool.hbm2ddl.SchemaExport  : ERROR: sequence "user_id_seq" does not exist
Run Code Online (Sandbox Code Playgroud)

我杀死了该应用程序并再次启动它,这一次,我得到了:

main] org.hibernate.tool.hbm2ddl.SchemaExport  : …
Run Code Online (Sandbox Code Playgroud)

postgresql hibernate spring-data database-sequence

6
推荐指数
1
解决办法
1万
查看次数

Oracle 12.2 - 替换 NOPARTITION 功能

我有 Oracle 版本 12.2.0.1.0

我们有通用脚本,它创建需要为不同对象重用的序列(通过重命名序列名称):

CREATE SEQUENCE NAME_SEQ MINVALUE 1 MAXVALUE 999999999
INCREMENT BY 1 START WITH 100 CACHE 200 NOORDER  NOCYCLE  NOPARTITION ;
Run Code Online (Sandbox Code Playgroud)

在我删除之前,此脚本无法处理以下错误NOPARTITION

   ORA-00933: SQL command not properly ended
Run Code Online (Sandbox Code Playgroud)

我在AskTom中发现12.2不支持NOPARTITION

以前版本的数据库中有很多内容不再相关/支持

为什么不支持它和/或此功能的替代品是什么?

如果没有替代品,您能否说明为什么不应使用此功能?

oracle database-partitioning ora-00933 oracle12c database-sequence

6
推荐指数
1
解决办法
4214
查看次数

序列存在,但我在 information_schema.sequences (PostgreSQL) 中找不到它

我已经在PostgreSQL(版本 13)数据库的架构(我们称之为my_schema )中创建了一个序列(我们称之为my_seq )。我确信该序列存在,因为我可以在查询的结果集中找到它

select n.nspname as sequence_schema, 
       c.relname as sequence_name
from pg_class c 
  join pg_namespace n on n.oid = c.relnamespace
where c.relkind = 'S'
and n.nspname = 'my_schema'
Run Code Online (Sandbox Code Playgroud)

但是,如果我运行以下查询

select sequence_name 
from information_schema.sequences 
where sequence_schema = 'my_schema'
Run Code Online (Sandbox Code Playgroud)

my_seq 不在结果集中。我已使用创建序列的同一用户运行这两个查询。

有人能帮我找到一个解释吗?

postgresql database-sequence

6
推荐指数
1
解决办法
1523
查看次数

为什么即使对象创建失败,Postgres 序列项也会上升?

我有一个 Postgres 项目,其中我的模型之一是Client,只需通过其主键进行索引。我在创建客户端时遇到了问题,因为有人创建了一个客户端,同时显式设置了我读过的主键,这不会影响 Postgres 的客户端序列表,该序列表负责在任何时候自动递增主键 1创建了一个 Client 对象。

我运行了一些 SQL 查询来研究它,发现当前序列值实际上比数据库中客户端的最高 ID 263 低 1,即 262,因此表明 ID 为 263 的客户端已经存在。我尝试在前端应用程序中创建一个客户端,再次收到错误,并决定重新运行查询。我看到数据库中没有像预期的那样创建新客户端,但我也注意到序列值确实达到了 263,因此当我尝试再次创建客户端时,它起作用了!

即使相关模型的创建失败,PostgreSQL 序列表也会递增,这是正常行为吗?如果是这样,这似乎可能会导致一些严重的问题。

postgresql database-sequence

5
推荐指数
1
解决办法
1485
查看次数

使用postgres中表标识的最后一个值重置标识列

我想将我现有的列更改为 Postgres 数据库中的自动标识。
我使用下面的脚本来设置自动标识列并设置默认从 1 开始。
但在这里我想将标识列值重置为表的最后一个值。
如果您有任何解决方案,请告诉我。

ALTER TABLE patient 
    ALTER patientid SET NOT NULL,
    ALTER patientid ADD GENERATED ALWAYS AS IDENTITY (START WITH 1);
Run Code Online (Sandbox Code Playgroud)

在这里,我正在设置这样的东西:

 ALTER TABLE Patient 
   ALTER COLUMN PatientId RESTART WITH (select Max(patientId) + 1 from patient);
Run Code Online (Sandbox Code Playgroud)

postgresql database-sequence

5
推荐指数
1
解决办法
2434
查看次数