PostgreSQL: как дублировать строку
Это схема моей таблицы web_book:
Column | Type | Modifiers
----------------+------------------------+-------------------------------------------------------
id | integer | not null default nextval('web_book_id_seq'::regclass)
page_count | integer | not null
year_published | integer | not null
file | character varying(100) | not null
image | character varying(100) | not null
display_on_hp | boolean | not null
name | character varying(128) | not null
description | text | not null
name_cs | character varying(128) |
name_en | character varying(128) |
description_cs | text |
description_en | text |
Таблица содержит одну строку с id=3
. Я хочу дублировать строку, но если я попробую это:
INSERT INTO web_book SELECT * FROM web_book WHERE id=3;
Я получаю это:
ERROR: duplicate key value violates unique constraint "web_book_pkey"
DETAIL: Key (id)=(3) already exists
Ответы
Ответ 1
Вам нужно создать новый идентификатор для вновь вставленной строки:
INSERT INTO web_book(
id, page_count, year_published, file, image,
display_on_hp, name, description, name_cs,
name_en, description_cs, description_en
)
SELECT nextval('web_book_id_seq'),
page_count,
year_published,
file,
image,
display_on_hp,
name,
description,
name_cs,
name_en,
description_cs,
description_en
FROM web_book WHERE id=3;
Как уже упоминалось в ClodoaldoNeto, вы можете сделать что-то немного проще, просто оставив столбец идентификаторов и дайте определению по умолчанию задание:
INSERT INTO web_book(
page_count, year_published, file, image,
display_on_hp, name, description, name_cs,
name_en, description_cs, description_en
)
SELECT page_count,
year_published,
file,
image,
display_on_hp,
name,
description,
name_cs,
name_en,
description_cs,
description_en
FROM web_book WHERE id=3;
В этом случае вам не нужно знать имя последовательности (но это немного менее очевидно, что происходит).
Ответ 2
Укажите столбец id
, только если вы укажете его значение (и это не ваш случай). Вы хотите использовать следующее значение последовательности web_book_id_seq
, поэтому не указывайте его в запросе INSERT.
Ваш INSERT должен выглядеть следующим образом:
INSERT INTO web_book (page_count, year_published, file, image, display_on_hp, name, description, name_cs, name_en, description_cs, description_en)
SELECT page_count, year_published, file, image, display_on_hp, name, description, name_cs, name_en, description_cs, description_en
FROM web_book
WHERE id = 3;