【问题标题】:PostgreSQL: insert from another tablePostgreSQL:从另一个表插入
【发布时间】: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”列中的空值违反了非空约束

【问题讨论】:

    标签: sql postgresql insert append


    【解决方案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;
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-04-08
          • 2012-12-05
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多