我遇到了我的主键序列与我的表行不同步的问题.
也就是说,当我插入一个新行时,我得到一个重复的键错误,因为串行数据类型中隐含的序列返回一个已经存在的数字.
这似乎是由导入/恢复不能正确维护序列引起的.
我正在尝试将序列设置为特定值.
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
我有一张桌子
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
如您所见,序列似乎不受事务回滚的影响.它们继续递增,就好像提交了事务一样,然后删除了该行.有没有办法防止序列以这种方式表现?
我正在尝试为序列创建动态起始编号,但它不接受变量即.@START_SEQ 对START 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) 我在数据库中有一个名为“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”需要根据票的生成顺序显示。
我正在编写一个 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) 我有 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
我已经在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 不在结果集中。我已使用创建序列的同一用户运行这两个查询。
有人能帮我找到一个解释吗?
我有一个 Postgres 项目,其中我的模型之一是Client,只需通过其主键进行索引。我在创建客户端时遇到了问题,因为有人创建了一个客户端,同时显式设置了我读过的主键,这不会影响 Postgres 的客户端序列表,该序列表负责在任何时候自动递增主键 1创建了一个 Client 对象。
我运行了一些 SQL 查询来研究它,发现当前序列值实际上比数据库中客户端的最高 ID 263 低 1,即 262,因此表明 ID 为 263 的客户端已经存在。我尝试在前端应用程序中创建一个客户端,再次收到错误,并决定重新运行查询。我看到数据库中没有像预期的那样创建新客户端,但我也注意到序列值确实达到了 263,因此当我尝试再次创建客户端时,它起作用了!
即使相关模型的创建失败,PostgreSQL 序列表也会递增,这是正常行为吗?如果是这样,这似乎可能会导致一些严重的问题。
我想将我现有的列更改为 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 ×8
ddl ×1
hibernate ×1
ora-00933 ×1
oracle ×1
oracle12c ×1
primary-key ×1
rollback ×1
spring-data ×1
sql-server ×1
sql-update ×1
t-sql ×1
transactions ×1