PostgreSQL:从另一个表插入

Posted

技术标签:

【中文标题】PostgreSQL:从另一个表插入【英文标题】:PostgreSQL: insert from another table 【发布时间】:2011-10-17 10:21:00 【问题描述】:

我正在尝试将数据从另一个表插入到一个表中,而这些表只有一个共同的列。问题是,TABLE1 的列不接受空值,因此我不能将它们留空,也不能从 TABLE2 中获取它们。

我有 TABLE1: id,col_1(非空),col_2(非空),col_3(非空)

和表 2: id, col_a, col_b, col_c

那么我如何将 id 从 TABLE2 插入到 TABLE1 并用硬编码字符串填充 col_1-3,例如“data1”、“data2”、“data3”?

INSERT INTO TABLE1 (id) SELECT id FROM TABLE2 WHERE col_a = "something";

将导致:

错误:“col_1”列中的空值违反了非空约束

【问题讨论】:

【参考方案1】:

您可以在 SELECT 中提供文字值:

INSERT INTO TABLE1 (id, col_1, col_2, col_3)
SELECT id, 'data1', 'data2', 'data3'
FROM TABLE2
WHERE col_a = 'something';

选择列表可以包含any value expression:

但选择列表中的表达式不必引用 FROM 子句的表表达式中的任何列;例如,它们可以是常量算术表达式。

字符串字面量当然是值表达式。

【讨论】:

你知道这种插入方式是否在底层使用了多值插入? @chomp INSERT 将是原子的,可以是insert into t (...) select ...insert into t (...) values (...), (...), ...。不过看看Erwin's answer over here。 是否支持“ON CONFLICT”? @hpaknia 你检查过documentation吗?【参考方案2】:

参考完整性:

insert into  main_tbl (col1, ref1, ref2, createdby)
values ('col1_val',
        (select ref1 from ref1_tbl where lookup_val = 'lookup1'),
        (select ref2 from ref2_tbl where lookup_val = 'lookup2'),
        'init-load'
       );

【讨论】:

【参考方案3】:

答案很晚,但我认为我的答案对于用户想要简单地将表 A 中的数据插入(复制)到表 B 中的特定用例更直接:

INSERT INTO table_b (col1, col2, col3, col4, col5, col6)
SELECT col1, 'str_val', int_val, col4, col5, col6
FROM table_a

【讨论】:

【参考方案4】:

你可以使用合并:

insert into destination select coalesce(field1,'somedata'),... from source;

【讨论】:

以上是关于PostgreSQL:从另一个表插入的主要内容,如果未能解决你的问题,请参考以下文章

Postgresql 内存表空间中的插入速度慢

带有 pg8000 的 PostgreSQL - 从 SQL 插入结果到另一个表

从另一个容器(Docker)连接到 postgresql 容器

PostgreSQL 9.3 触发函数以参数化名称插入表

postgresql 上的更新类型

如何加快 PostgreSQL 中的插入性能