2013-03-15 16 views
21

Jest to schemat mojego stołu web_book:postgreSQL: jak duplikat wiersz

 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     | 

Tabela zawiera jeden wiersz z id=3. Chcę duplikat wiersz ale gdy próbuję to:

INSERT INTO web_book SELECT * FROM web_book WHERE id=3; 

uzyskać to:

ERROR: duplicate key value violates unique constraint "web_book_pkey" 
DETAIL: Key (id)=(3) already exists 

Odpowiedz

40

Musisz utworzyć nowy identyfikator dla nowo wstawionego wiersza:

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; 

Jak wspomniano przez ClodoaldoNeto, możesz nieco ułatwić sobie zadanie, po prostu pomijając kolumnę ID i domyślną definicję należy podać:

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; 

W tym przypadku nie trzeba znać nazwy sekwencji (ale jest nieco mniej oczywiste, co się dzieje).

+4

@clime Od 'nextval' jest domyślną dla' id' kolumnie nie jest konieczne, aby go zgłosić. 'INSERT INTO web_book ( page_count, ...) SELECT page_count, ...' –

+0

@ ClodoaldoNeto: dzięki, dobry punkt. Dodałem to. –

+0

Rozumiem. Dziękuję Ci! – clime

6

Określ kolumnę id tylko wtedy, gdy określisz jej wartość (i nie jest to twoja sprawa). Chcesz użyć następnej wartości sekwencji web_book_id_seq, więc nie podawaj jej w zapytaniu INSERT.

Twój INSERT powinien wyglądać następująco:

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;