Postgresql

插入到表中省略具有預設值的列

  • August 22, 2017

我有一個 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以某種方式使用,但我無法根據文件獲得正確的語法。

有沒有辦法做到這一點而不必列出所有沒有預設值的列?

*不,您要麼使用擴展插入所有列,

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

預設值,所有列都將填充其預設值。

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)

引用自:https://dba.stackexchange.com/questions/184092