2013-03-15 13 views
21

Ceci est le schéma de ma table web_book:postgreSQL: comment dupliquer une ligne

 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     | 

Le tableau contient une ligne avec id=3. Je veux dupliquer la ligne mais si j'essaie ceci:

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

Je reçois ceci:

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

Répondre

40

Vous devez créer un nouvel ID pour la nouvelle ligne insérée:

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; 

Comme mentionné par ClodoaldoNeto vous pouvez rendre les choses un peu plus facile en laissant simplement de côté la colonne ID et laisser la définition par défaut faire son travail:

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; 

Dans ce cas, vous n'avez pas besoin de connaître le nom de la séquence (mais il est un peu moins évident de savoir ce qui se passe).

+4

@clime Depuis la 'nextval' est la valeur par défaut de la colonne' id' il est pas nécessaire de le déclarer. 'INSERT INTO web_book ( page_count, ...) SELECT page_count, ...' –

+0

@ClodoaldoNeto: merci, bon point. J'ai ajouté ça. –

+0

Je vois. Je vous remercie! – clime

6

Spécifiez id colonne uniquement si vous spécifiez sa valeur (et ce n'est pas votre cas). Vous souhaitez utiliser la valeur de séquence suivante web_book_id_seq, ne le spécifiez donc pas dans votre requête INSERT.

Votre INSERT devrait ressembler à ceci:

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; 
Questions connexes