关于这个答案,我偶然发现了一个我无法解释的现象.
版本:
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)
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
.
我错过了什么,或者这是一个(相当无害)的错误?
因此,修改CTE的数据也可以工作,尽管它有一个NOT DEFERRED
pk 失败:
WITH x AS (
UPDATE t SET id = 1 WHERE id = 2 …
Run Code Online (Sandbox Code Playgroud) 我需要对记录集合进行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 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功能是唯一的其他选项吗?