我有一个数据库表,其中一个字段(不是主键)有一个唯一的索引.现在我想将此列下的值换成两行.怎么可以这样做?我知道的两个黑客是:
但我不想这样做,因为它们似乎不是解决问题的合适方法.任何人都可以帮我吗?
关于这个答案,我偶然发现了一个我无法解释的现象.
版本:
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 DEFERREDpk 失败:
WITH x AS (
UPDATE t SET id = 1 WHERE id = 2 …Run Code Online (Sandbox Code Playgroud) 我的问题与这个问题相关。我想切换表的两个被定义为主键的ID。
但不幸的是,我想要切换 ids 的表已经创建,并且主键约束没有设置 do deferrable。
我尝试使用以下语句将其设置为可推迟:
alter table table_name alter constraint primary_key_name_pkey deferrable;
并得到一个错误:
constraint "primary_key_name_pkey" of relation "table_name" is not a foreign key constraint
有没有办法在创建后将主键约束设置为可延迟?
感谢您的帮助。