51

これは私のテーブル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                   |

テーブルには、 を含む 1 つの行が含まれてい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
4

2 に答える 2

88

新しく挿入された行の新しい 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;

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

于 2013-03-15T10:59:58.590 に答える
15

列を指定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;
于 2013-03-16T18:29:30.260 に答える