PostgreSQL:从另一个表插入

时间:2011-08-01 12:38:13

标签: sql postgresql insert append

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

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

和TABLE2: id,col_a,col_b,col_c

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

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

将导致:

  

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

4 个答案:

答案 0 :(得分:167)

只需在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子句的表表达式中的任何列;例如,它们可以是常数算术表达式。

字符串文字当然是一个值表达式。

答案 1 :(得分:4)

你可以使用coalesce:

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

答案 2 :(得分:3)

对于参照完整性:

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 :(得分:0)

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

def addTwoNumbers(self, l1, l2):
    if not any(l for l in {l1, l2}):
        return []

    temp = 0
    while l1 or l2:
        ...