我正在使用Postgres 9.5并在这里看到一些有线的东西.
我有一个cron作业运行5分钟,触发一个sql语句,如果不存在则添加一个记录列表.
INSERT INTO
sometable (customer, balance)
VALUES
(:customer, :balance)
ON CONFLICT (customer) DO NOTHING
Run Code Online (Sandbox Code Playgroud)
sometable.customer是主键(文本)
sometable结构是:
id:serial
customer:text
balance:bigint
现在似乎每次这个作业运行时,id字段都会以静默方式递增+1.所以下次,我真的添加一个字段,它比我上一个值高出数千个数字.我认为这个查询检查冲突,如果是这样,什么都不做,但目前似乎它试图插入记录,增加id然后停止.
有什么建议?
我必须/必须为发票创建唯一的ID.我有一个表id和另一列这个唯一的数字.我使用序列化隔离级别.运用
var seq = @"SELECT invoice_serial + 1 FROM invoice WHERE ""type""=@type ORDER BY invoice_serial DESC LIMIT 1";
Run Code Online (Sandbox Code Playgroud)
没有帮助,因为即使使用FOR UPDATE它也不会像序列化级别那样读取正确的值.
只有解决方案似乎放了一些重试代码.
在PostgreSQL数据库中,我有一个带有主键的表和另一个需要唯一的字段.
CREATE TABLE users (
id INTEGER PRIMARY KEY DEFAULT nextval('groups_id_seq'::regclass),
name VARCHAR(255) UNIQUE NOT NULL
);
INSERT users (name) VALUES ('foo');
INSERT users (name) VALUES ('foo');
INSERT users (name) VALUES ('bar');
Run Code Online (Sandbox Code Playgroud)
第二个插入失败但序列groups_id_seq已经递增,所以当添加'bar'时,它会在id号中留下一个间隙.
有没有办法告诉PostgreSQL仅在满足其他约束时才获取下一个值,或者如果名称不重复,我应该首先使用SELECT检查?这仍然不能保证缺乏差距,但至少当有另一个进程试图同时插入相同的名称时,它会减少它们的数量
我试图找出为什么Django(或PostgreSQL,不确定它在哪个级别)不重用已被删除的对象的主键.创建对象时,它们都具有一个自动递增的id值,并按数据库中的id值排序.例如:
ID
五
4
3
2
1
假设我碰巧删除ID为5的对象:
ID
4
3
2
1
当我创建一个新对象时,它的ID为6:
ID
6
4
3
2
1
为什么不将"5"指定为刚创建的新对象的主键?为什么它有6个呢?
我需要读取函数中序列的当前值.但是,在每个会话中我第一次尝试使用currval(),我得到以下错误:
currval of sequence "foo_seq" is not yet defined in this session
Run Code Online (Sandbox Code Playgroud)
提示那些可能通过Google搜索此错误找到此问题的人:您需要通过nextval()或setval()初始化每个会话的序列.
我可以使用类似lastval()甚至setval('your_table_id_seq', (SELECT MAX(id) FROM your_table));相反的东西,但这似乎要么容易出现间隙,要么比简单慢currval().我的目标是避免间隙和不一致(我知道一些值将手动添加),因此在逻辑处理它们之前使用nextval()并不适合我的目的.我还需要这个来初始化会话的序列,但我更喜欢这样做:
--start of the function here
IF is_not_initialized THEN
SELECT setval('foo_seq', (SELECT MAX(id) FROM bar_table)) INTO _current;
ELSE
SELECT currval('foo_seq') INTO _current;
END IF;
--some magic with the _current variable and nextvalue() on the right position
Run Code Online (Sandbox Code Playgroud)
关键是我不知道"is_not_initialized"是什么样子,以及它是否可能.有没有任何功能或其他技巧呢?
编辑:实际上,我的计划是让每一组客户在正确的序列,完全没有序列,以及我现在要求的奇怪的"类似序列"之间进行选择.即使客户想要这样一个奇怪的序列,它也只能用于需要它的列 - 通常是因为有一些模拟数据,我们需要将它们的密钥(通常几乎无间隙的序列)存储到DB中以便向后兼容.
无论如何,你是对的,这不是正确的解决方案,并且在这些情况下没有顺序可能比这种凌乱的解决方案更好,所以我会再次考虑(并与客户讨论)是否真的需要它.
可能重复:
如果在PostgreSQL中插入失败,有没有办法避免调用nextval()?
Rails - Postgres不会重复使用已删除的ID但是MySql会这样做吗?
我有一个非常简单的数据库与PostgreSQL 9.2.1.当我使用此方法插入Doctrine2的东西时:
$em->persist($entity);
$em->flush();
Run Code Online (Sandbox Code Playgroud)
如果我收到错误
-means记录不 inserted-
它仍然添加1到我的主键.因此,如果我刷新页面50时间,则表示自动增量值设置为50.我怎么能阻止这个?如果记录没有说明为什么主键增加.这非常关键,因为它使用索引,而且数量不断变大.
我不知道它是什么来的,为什么,所以,我没有尝试任何东西.此时非常困难.
如果在 SQL Server 中我们有一个自动增量的表,有 10 行,最后一行有id = 10. 当你删除最后一行时,你插入的下一行也会得到id = 10,对吧?
但在 Postgres 中,使用bigserialas PK 时,当我删除具有 max 的行id并插入新行时,它会不断增加 pk 数。
是对的吗?
postgresql ×7
sql ×2
database ×1
django ×1
doctrine-orm ×1
key ×1
php ×1
primary-key ×1
sequence ×1
session ×1
symfony ×1