相关疑难解决方法(0)

尽管我在冲突中加入了什么,但postgres中的连续性正在增加

我正在使用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然后停止.

有什么建议?

database postgresql

12
推荐指数
2
解决办法
5934
查看次数

postgresql生成没有间隙的序列

我必须/必须为发票创建唯一的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它也不会像序列化级别那样读取正确的值.

只有解决方案似乎放了一些重试代码.

sql postgresql

7
推荐指数
2
解决办法
6387
查看次数

有没有办法避免在PostgreSQL中插入失败时调用nextval()?

在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检查?这仍然不能保证缺乏差距,但至少当有另一个进程试图同时插入相同的名称时,它会减少它们的数量

sql postgresql

6
推荐指数
3
解决办法
2096
查看次数

为什么Django/PostgreSQL在删除具有该主键的对象后不重用主键值?

我试图找出为什么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个呢?

django postgresql primary-key

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

如何确定序列是否在此会话中初始化?

我需要读取函数中序列的当前值.但是,在每个会话中我第一次尝试使用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 session sequence

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

doctrine2在无法插入记录时增加了我的主键

可能重复:
如果在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.我怎么能阻止这个?如果记录没有说明为什么主键增加.这非常关键,因为它使用索引,而且数量不断变大.

我不知道它是什么来的,为什么,所以,我没有尝试任何东西.此时非常困难.

php postgresql symfony doctrine-orm

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

Postgres中的DELETE不会减少串行PK?

如果在 SQL Server 中我们有一个自动增量的表,有 10 行,最后一行有id = 10. 当你删除最后一行时,你插入的下一行也会得到id = 10,对吧?

但在 Postgres 中,使用bigserialas PK 时,当我删除具有 max 的行id并插入新行时,它会不断增加 pk 数。

是对的吗?

postgresql key auto-increment

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