PostgreSQL: insertar desde otra tabla


101

Estoy tratando de insertar datos en una tabla desde otra tabla y las tablas solo tienen una columna en común. El problema es que TABLE1 tiene columnas que no aceptan valores nulos, por lo que no puedo dejarlos vacíos y no puedo obtenerlos de TABLE2.

Tengo TABLE1: id, col_1 (no nulo), col_2 (no nulo), col_3 (no nulo)

y TABLE2: id, col_a, col_b, col_c

entonces, ¿cómo podría insertar la identificación de TABLE2 a TABLE1 y llenar el col_1-3 con cadenas codificadas como "data1", "data2", "data3"?

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

resultará en:

ERROR: el valor nulo en la columna "col_1" viola la restricción no nula

Respuestas:


202

Simplemente proporcione valores literales en SELECT:

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

Una lista de selección puede contener cualquier expresión de valor :

Pero las expresiones en la lista de selección no tienen que hacer referencia a ninguna columna en la expresión de tabla de la cláusula FROM; pueden ser expresiones aritméticas constantes, por ejemplo.

Y un literal de cadena es ciertamente una expresión de valor.


4

Podrías usar coalesce:

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

2

Respuesta muy tardía, pero creo que mi respuesta es más sencilla para casos de uso específicos en los que los usuarios simplemente quieren insertar (copiar) datos de la tabla A en la tabla B:

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

0

Por integridad referencial:

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'
       );
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.