You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在INSERT中结合VALUES与SELECT语句?SERIAL主键数据插入问题

PostgreSQL从现有表填充数据并自动生成SERIAL主键

问题场景

创建了带SERIAL主键的表dimCustomer3:

CREATE TABLE dimCustomer3
(
    customer_key SERIAL PRIMARY KEY,
    customer_id  smallint NOT NULL,
    first_name   varchar(45) NOT NULL,
    last_name    varchar(45) NOT NULL,
    email        varchar(45) NOT NULL
);

手动插入单条数据时,用VALUES(DEFAULT, 1, 'Joe', 'Smith', 'jsmith@email.com')可以让SERIAL自动生成主键,但尝试从现有customer表批量填充其余字段时,两种写法均失败:

失败写法1

INSERT INTO dimCustomer3 (customer_key, customer_id, first_name, last_name, email) 
VALUES(DEFAULT) 
CROSS JOIN (SELECT c.customer_ID, c.first_name, c.last_name, c.email FROM customer c) a

失败写法2

INSERT INTO dimCustomer3 (customer_key, customer_id, first_name, last_name, email) 
VALUES(DEFAULT, (SELECT c.customer_ID, c.first_name, c.last_name, c.email FROM customer c));

正确解决方案

使用INSERT ... SELECT语法直接批量插入,SERIAL类型的主键字段会自动生成值,无需额外处理:

写法1(推荐,省略主键字段)

INSERT INTO dimCustomer3 (customer_id, first_name, last_name, email)
SELECT customer_id, first_name, last_name, email
FROM customer;

写法2(显式指定主键字段)

如果需要显式声明所有字段,用DEFAULT对应SERIAL主键:

INSERT INTO dimCustomer3 (customer_key, customer_id, first_name, last_name, email)
SELECT DEFAULT, customer_id, first_name, last_name, email
FROM customer;

失败原因说明

  • 写法1错误:VALUES(DEFAULT)仅生成一行数据,和customer表的CROSS JOIN语法不匹配,VALUES子句不能和SELECT这样结合使用。
  • 写法2错误:子查询返回了4个字段,但VALUES子句的第二个位置只能接收单个值,字段数量不匹配导致报错。

内容的提问来源于stack exchange,提问作者Dev_Reka

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 05:42:12