假设我在管理一个简单的表。此外,每个用户都可以间接地创建每一行的副本并自行修改它。
这是我的设置:
-- the original table
CREATE TABLE test
(
id integer PRIMARY KEY,
a integer,
b integer NOT NULL,
c integer
);
-- the table holding a modified copy of the former table
CREATE TABLE test_copy
(
copy_position integer NOT NULL, -- some additional data attached to the copy
id integer PRIMARY KEY REFERENCES test(id), -- the id of the copied row
a integer,
b integer NOT NULL,
c integer
);
-- some sample data
INSERT INTO test VALUES (1, 4, 4, 4), (2, 7, 3, 2), (3, 72, 23, 7), (4, 11, 22, 33);
我必须创建一个函数来复制在
test
表中现有行的副本。但是,以下本应执行任务的语句失败了:INSERT INTO test_copy(copy_position, id, a, b, c)
(SELECT 666, 3, t.a, t.b, t.c
FROM test AS t);
出现以下错误:
ERROR: duplicate key value violates unique constraint "test_copy_pkey"
DETAIL: Key (id)=(3) already exists.
test_copy
表完全为空。前一个语句是唯一为表提供任何行的INSERT
语句,但它在某种程度上违反了惟一约束。手动插入值,而不成功执行SELECT
子查询。经过几个小时的研究,我已经没有什么想法可能是错误的原因,我觉得这个问题的解决办法必须非常简单。我正在使用PostgreSQL 9.4。 最佳答案
好吧,这个问题完全不是问题。它在发布后的前两分钟就被@a_horse_with_no_name in the comments部分回复(谢谢),而问题本身几乎是新手犯的错误。
我完全忘记了WHERE
子查询中的SELECT
子句。改为:
INSERT INTO test_copy(copy_position, id, a, b, c)
(SELECT 666, t.id, t.a, t.b, t.c
FROM test AS t WHERE t.id = 3);
这就是这个问题的答案。