插入表,忽略具有默认值的列

Ale*_*lex 5 postgresql insert subquery default-value

我有一个 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)
)
Run Code Online (Sandbox Code Playgroud)

在许多情况下,我必须从具有相同结构的另一个表中插入记录:

INSERT INTO some_schema.some_table (col2,col3...col35)
    SELECT col2,col3...col35
    FROM some_schema.another_table_with_same_structure;
Run Code Online (Sandbox Code Playgroud)

有没有一种方法可以做到这一点,而不必列出所有没有默认值的列?我想我可以以某种方式使用,但我无法根据文档DEFAULT VALUES获得正确的语法。

Eva*_*oll 4

有没有一种方法可以做到这一点,而不必列出所有没有默认值的列?

不,您要么使用扩展插入所有列*

INSERT INTO foo 
  SELECT * FROM bar;
Run Code Online (Sandbox Code Playgroud)

或者,您只插入列出的列

INSERT INTO foo (col2,col3)
  SELECT col2, col3
  FROM bar;
Run Code Online (Sandbox Code Playgroud)

你也可以表达DEFAULT得很明确,但没有人这样做。然而,在规范中,显式或隐式列列表中不存在的每一列都将填充一个默认值,要么是其声明的默认值,要么是 null(如果没有)。明确看起来像这样。

INSERT INTO foo (col1,col2,col3)
  SELECT DEFAULT, col2, col3
  FROM bar;
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

  • 当尝试在“SELECT”子句中使用“DEFAULT”时,我收到“*在此上下文中不允许使用默认值*”。这有改变吗? (3认同)