web-dev-qa-db-ja.com

デフォルト値を持つ列を省略してテーブルに挿入する

同じ構造のテーブルがたくさんあるPostgreSQLデータベースがあり、合計36列です。

CREATE TABLE some_schema.some_table    (
    id integer NOT NULL DEFAULT nextval('some_schema.id_seq'::regclass),
    col2,
    col3,
    col4,
    [...],
    col35,
    mi_prinx integer NOT NULL DEFAULT nextval('some_schema.mi_prinx_seq'::regclass),
    CONSTRAINT some_table_pkey PRIMARY KEY (mi_prinx)
)

多くの場合、同じ構造を持つ別のテーブルからレコードを挿入する必要があります。

INSERT INTO some_schema.some_table (col2,col3...col35)
    SELECT col2,col3...col35
    FROM some_schema.another_table_with_same_structure;

デフォルト値を持たないすべての列をリストする必要なしにこれを行う方法はありますか? DEFAULT VALUESどういうわけか documentation に基づいて正しい構文を取得できません。

2
Alex

デフォルト値を持たないすべての列をリストする必要なしにこれを行う方法はありますか?

いいえ、*拡張を使用してすべての列を挿入することも、

INSERT INTO foo 
  SELECT * FROM bar;

または、リストされた列だけを挿入します

INSERT INTO foo (col2,col3)
  SELECT col2, col3
  FROM bar;

明示的にDEFAULTを使用することもできますが、誰もそれを行いません。ただし、仕様に含まれています明示的または暗黙的な列リストに存在しない各列には、宣言されたデフォルト値または存在しない場合はnullのいずれかのデフォルト値が入力されます。明示的であることは次のようになります。

INSERT INTO foo (col1,col2,col3)
  SELECT DEFAULT, col2, col3
  FROM bar;

DEFAULT COLUMNSは、すべての列をそれぞれのデフォルトに設定します。 DEFAULT COLUMNSのドキュメントから、

DEFAULT VALUES、すべての列はデフォルト値で埋められます。

CREATE TABLE foo (id serial, foo serial, bar serial);
INSERT INTO foo (id,foo,bar) VALUES (DEFAULT, DEFAULT, DEFAULT);
INSERT INTO foo DEFAULT VALUES;
INSERT INTO foo(id,foo,bar) VALUES (42,42,DEFAULT);

TABLE foo;
 id | foo | bar 
----+-----+-----
  1 |   1 |   1
  2 |   2 |   2
 42 |  42 |   3
(3 rows)
3
Evan Carroll