相关疑难解决方法(0)

约束定义DEFERRABLE INTITIALLY IMMEDIATE仍然是DEFERRED?

关于这个答案,我偶然发现了一个我无法解释的现象.

版本:
x86_64-unknown-linux-gnu上的PostgreSQL 9.1.2,由gcc-4.4.real编译(Debian 4.4.5-8)4.4.5,64位

请考虑以下演示.测试平台:

CREATE TEMP TABLE t (
  id  integer
 ,txt text
 ,CONSTRAINT t_pkey PRIMARY KEY (id) DEFERRABLE INITIALLY IMMEDIATE
);

INSERT INTO t VALUES
 (1, 'one')
,(2, 'two');
Run Code Online (Sandbox Code Playgroud)

1)修改多行的UPDATE语句:

UPDATE t
SET    id = t_old.id
FROM   t t_old
WHERE (t.id, t_old.id) IN ((1,2), (2,1));
Run Code Online (Sandbox Code Playgroud)

目前的实施似乎有一个错误?上面的UPDATE虽然不应该有效.约束已定义INITIALLY IMMEDIATE,我没有使用SET CONSTRAINTS.

我错过了什么,或者这是一个(相当无害)的错误?


2)数据修改CTE

因此,修改CTE的数据也可以工作,尽管它有一个NOT DEFERREDpk 失败:

WITH x AS (
    UPDATE t SET id = 1 WHERE id = 2 …
Run Code Online (Sandbox Code Playgroud)

postgresql constraints postgresql-9.1

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

Postgres UPDATE with ORDER BY,怎么做?

我需要对记录集合进行Postgres更新,并且我正在尝试防止压力测试中出现的死锁.

对此的典型解决方案是按照特定顺序更新记录,例如ID - 但似乎Postgres不允许ORDER BY进行更新.

假设我需要进行更新,例如:

UPDATE BALANCES WHERE ID IN (SELECT ID FROM some_function() ORDER BY ID);
Run Code Online (Sandbox Code Playgroud)

同时运行200个查询时会导致死锁.该怎么办?

我正在寻找一个通用的解决方案,而不是像在使用ORDER BY的UPDATE中那样的特定于案例的解决方法

认为,必须有比写一个光标功能更好的解决方案.此外,如果没有更好的方法,那么光标的最佳运行方式是什么?逐个记录更新

postgresql database-deadlocks

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

是否可以在每个记录标签上使用PG序列?

PostgreSQL 9.2+是否提供了任何功能,可以生成一个命名空间为特定值的序列?例如:

 .. | user_id | seq_id | body | ...
 ----------------------------------
  - |    4    |   1    |  "abc...."
  - |    4    |   2    |  "def...."
  - |    5    |   1    |  "ghi...."
  - |    5    |   2    |  "xyz...."
  - |    5    |   3    |  "123...."
Run Code Online (Sandbox Code Playgroud)

这对于为用户生成自定义URL非常有用:

domain.me/username_4/posts/1    
domain.me/username_4/posts/2

domain.me/username_5/posts/1
domain.me/username_5/posts/2
domain.me/username_5/posts/3
Run Code Online (Sandbox Code Playgroud)

我没有在PG文档中找到任何内容(关于序列和序列函数)来执行此操作.INSERT语句中的子查询或自定义PG功能是唯一的其他选项吗?

sql postgresql concurrency database-design sequence

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