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:从另一个表插入的主要内容,如果未能解决你的问题,请参考以下文章
带有 pg8000 的 PostgreSQL - 从 SQL 插入结果到另一个表