2013-03-15 23 views
21

これは私のテーブルweb_bookのスキームである:postgreSQLの:行を複製する方法

 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で1行が含まれています。私は、行を複製したいが、私はこのしようとした場合:

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 

答えて

40

あなたが新たに挿入されたローの新しいIDを作成する必要があります。

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で述べたように、単にID列を省略して、デフォルトの定義でその作業をやり直すだけで、少し簡単にすることができます:

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; 

この場合、シーケンス名を知る必要はありません(ただし、何が起こっているのかがはっきりしません)。

+4

@clime。 'INSERT INTO web_book( page_count、...)SELECT page_count、... ' –

+0

@ClodoaldoNeto:ありがとう、良い点。私はそれを付け加えた。 –

+0

私は参照してください。ありがとうございました! – clime

6

idの列は、その値を指定した場合のみ指定します(これはあなたのケースではありません)。次のシーケンスweb_book_id_seqの値を使用したいので、INSERTクエリで指定しないでください。

あなたのINSERTはこのようになります必要があります: `nextval`は、それを宣言する必要はありません` id`列のデフォルトであるので

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; 
関連する問題