INSERT

INSERT — crear nuevas filas en una tabla

Synopsis

[ WITH [ RECURSIVE ] consulta_with [, ...] ]
INSERT INTO nombre_tabla [ AS alias ] [ ( nombre_columna [, ...] ) ]
    [ OVERRIDING { SYSTEM | USER } VALUE ]
    { DEFAULT VALUES | VALUES ( { expresión | DEFAULT } [, ...] ) [, ...] | consulta }
    [ ON CONFLICT [ destino_conflicto ] acción_conflicto ]
    [ RETURNING [ WITH ( { OLD | NEW } AS alias_salida [, ...] ) ]
                { * | expresión_salida [ [ AS ] nombre_salida ] } [, ...] ]

donde destino_conflicto puede ser uno de:

    ( { nombre_columna_índice | ( expresión_índice ) } [ COLLATE colación ] [ clase_operadores ] [, ...] ) [ WHERE predicado_índice ]
    ON CONSTRAINT nombre_restricción

y acción_conflicto es uno de:

    DO NOTHING
    DO UPDATE SET { nombre_columna = { expresión | DEFAULT } |
                    ( nombre_columna [, ...] ) = [ ROW ] ( { expresión | DEFAULT } [, ...] ) |
                    ( nombre_columna [, ...] ) = ( sub-SELECT )
                  } [, ...]
              [ WHERE condición ]

Descripción

INSERT inserta nuevas filas en una tabla. Se pueden insertar una o más filas especificadas por expresiones de valor, o cero o más filas resultantes de una consulta.

Los nombres de las columnas de destino se pueden enumerar en cualquier orden. Si no se proporciona ninguna lista de nombres de columnas, el valor por omisión son todas las columnas de la tabla en su orden declarado; o los primeros N nombres de columnas, si la cláusula VALUES o la consulta solo proporcionan N columnas. Los valores proporcionados por la cláusula VALUES o la consulta se asocian con la lista de columnas explícita o implícita de izquierda a derecha.

Cada columna que no esté presente en la lista de columnas explícita o implícita se llenará con un valor por omisión, ya sea su valor por omisión declarado o nulo (null) si no hay ninguno.

Si la expresión para cualquier columna no es del tipo de datos correcto, se intentará una conversión automática de tipo.

El comando INSERT en tablas que carecen de índices únicos no se bloqueará por la actividad concurrente. Las tablas con índices únicos podrían bloquearse si las sesiones concurrentes realizan acciones que bloquean o modifican filas que coinciden con los valores del índice único que se están insertando; los detalles se tratan en la Section 63.5. Se puede usar ON CONFLICT para especificar una acción alternativa a lanzar un error de violación de restricción única o de restricción de exclusión (consulta la ON CONFLICT Clause más abajo).

La cláusula opcional RETURNING hace que INSERT calcule y devuelva los valores basados en cada fila insertada realmente (o actualizada, si se utilizó una cláusula ON CONFLICT DO UPDATE). Esto es principalmente útil para obtener valores suministrados por valores por omisión, como un número de secuencia serial. Sin embargo, se permite cualquier expresión que utilice las columnas de la tabla. La sintaxis de la lista RETURNING es idéntica a la de la lista de salida de SELECT. Solo se devolverán las filas que se hayan insertado o actualizado correctamente. Por ejemplo, si una fila se bloqueó pero no se actualizó porque no se cumplió la condición de una cláusula ON CONFLICT DO UPDATE ... WHERE, la fila no se devolverá.

Debes tener el privilegio INSERT en una tabla para poder insertar en ella. Si ON CONFLICT DO UPDATE está presente, también se requiere el privilegio UPDATE en la tabla.

Si se especifica una lista de columnas, solo necesitas el privilegio INSERT en las columnas indicadas. Del mismo modo, cuando se especifica ON CONFLICT DO UPDATE, solo necesitas el privilegio UPDATE en las columnas que se listan para ser actualizadas. Sin embargo, todas las formas de ON CONFLICT también requieren el privilegio SELECT en cualquier columna cuyos valores se lean. Esto incluye cualquier columna mencionada en destino_conflicto (incluyendo las columnas a las que hace referencia la restricción árbitro), y cualquier columna mencionada en una ON CONFLICT DO UPDATE expresión, o en una condición de la cláusula WHERE.

El uso de la cláusula RETURNING requiere el privilegio SELECT en todas las columnas mencionadas en RETURNING. Si utilizas la cláusula de consulta para insertar filas a partir de una consulta, por supuesto necesitas tener el privilegio SELECT en cualquier tabla o columna utilizada en la consulta.

Parámetros

Inserción

Esta sección cubre los parámetros que se pueden utilizar cuando solo se insertan nuevas filas. Los parámetros utilizados exclusivamente con la cláusula ON CONFLICT se describen por separado.

consulta_with

La cláusula WITH te permite especificar una o más subconsultas a las que se puede hacer referencia por nombre en la consulta INSERT. Consulta la Section 7.8 y la SELECT para obtener detalles.

Es posible que la consulta (sentencia SELECT) también contenga una cláusula WITH. En tal caso, ambos conjuntos de consulta_with se pueden referenciar dentro de la consulta, pero el segundo tiene prioridad ya que está anidado más estrechamente.

nombre_tabla

El nombre (opcionalmente calificado por esquema) de una tabla existente.

alias

Un nombre sustituto para nombre_tabla. Cuando se proporciona un alias, este oculta por completo el nombre real de la tabla. Esto es particularmente útil cuando ON CONFLICT DO UPDATE se dirige a una tabla llamada excluded, ya que de lo contrario se tomaría como el nombre de la tabla especial que representa la fila propuesta para su inserción.

nombre_columna

El nombre de una columna en la tabla denominada por nombre_tabla. El nombre de la columna se puede calificar con un nombre de subcampo o un subíndice de matriz, si es necesario. (Insertar en solo algunos campos de una columna compuesta deja los otros campos como nulos). Al hacer referencia a una columna con ON CONFLICT DO UPDATE, no incluyas el nombre de la tabla en la especificación de una columna de destino. Por ejemplo, INSERT INTO nombre_tabla ... ON CONFLICT DO UPDATE SET nombre_tabla.col = 1 no es válido (esto sigue el comportamiento general para UPDATE).

OVERRIDING SYSTEM VALUE

Si se especifica esta cláusula, cualquier valor suministrado para las columnas de identidad anulará los valores por omisión generados por la secuencia.

Para una columna de identidad definida como GENERATED ALWAYS, es un error insertar un valor explícito (que no sea DEFAULT) sin especificar OVERRIDING SYSTEM VALUE u OVERRIDING USER VALUE. (Para una columna de identidad definida como GENERATED BY DEFAULT, OVERRIDING SYSTEM VALUE es el comportamiento normal y especificarlo no hace nada, but PostgreSQL lo permite como una extensión).

OVERRIDING USER VALUE

Si se especifica esta cláusula, cualquier valor proporcionado para las columnas de identidad se ignora y se aplican los valores por omisión generados por la secuencia.

Esta cláusula es útil, por ejemplo, al copiar valores entre tablas. Escribir INSERT INTO tbl2 OVERRIDING USER VALUE SELECT * FROM tbl1 copiará de tbl1 todas las columnas que no sean de identidad en tbl2, mientras que los valores para las columnas de identidad en tbl2 serán generados por las secuencias asociadas con tbl2.

DEFAULT VALUES

Todas las columnas se llenarán con sus valores por omisión, como si DEFAULT se hubiera especificado explícitamente para cada columna. (No se permite una cláusula OVERRIDING en esta forma).

expresión

Una expresión o valor para asignar a la columna correspondiente.

DEFAULT

La columna correspondiente se llenará con su valor por omisión. Una columna de identidad se llenará con un nuevo valor generado por la secuencia asociada. Para una columna generada, se permite especificar esto, pero simplemente indica el comportamiento normal de calcular la columna a partir de su expresión de generación.

consulta

Una consulta (sentencia SELECT) que proporciona las filas a insertar. Consulta la sentencia SELECT para una descripción de la sintaxis.

alias_salida

Un nombre sustituto opcional para las filas OLD o NEW en la lista RETURNING.

Por omisión, los valores antiguos de la tabla de destino se pueden devolver escribiendo OLD.nombre_columna u OLD.*, y los valores nuevos se pueden devolver escribiendo NEW.nombre_columna o NEW.*. Cuando se proporciona un alias, estos nombres se ocultan y las filas antiguas o nuevas deben referenciarse usando el alias. Por ejemplo, RETURNING WITH (OLD AS o, NEW AS n) o.*, n.*.

expresión_salida

Una expresión que el comando INSERT calcula y devuelve después de insertar o actualizar cada fila. La expresión puede utilizar cualquier nombre de columna de la tabla indicada en nombre_tabla. Escribe * para devolver todas las columnas de la(s) fila(s) insertada(s) o actualizada(s).

Un nombre de columna o * puede calificarse utilizando OLD or NEW, o el correspondiente alias_salida para OLD o NEW, para hacer que se devuelvan los valores antiguos o nuevos. Un nombre de columna sin calificar, o *, o un nombre de columna o * calificado con el nombre o alias de la tabla de destino devolverá los valores nuevos.

Para un INSERT simple, todos los valores antiguos serán NULL. Sin embargo, para un INSERT con una cláusula ON CONFLICT DO UPDATE, los valores antiguos pueden ser distintos de NULL.

nombre_salida

Un nombre para usar en una columna devuelta.

Cláusula ON CONFLICT

La cláusula opcional ON CONFLICT especifica una acción alternativa a lanzar un error de violación de unicidad o de restricción de exclusión. Para cada fila individual propuesta para su inserción, la inserción procede o, si se viola una restricción de árbitro o un índice especificado por destino_conflicto, se toma la acción_conflicto alternativa. ON CONFLICT DO NOTHING simplemente evita insertar la fila como su acción alternativa. ON CONFLICT DO UPDATE actualiza la fila existente que entra en conflicto con la fila propuesta para su inserción como su acción alternativa.

destino_conflicto puede realizar una inferencia de índice único. Al realizar la inferencia, consiste en una o más columnas nombre_columna_índice y/o expresiones expresión_índice, y un predicado_índice opcional. Todos los índices únicos de nombre_tabla que, sin importar el orden, contienen exactamente las columnas/expresiones especificadas en el destino_conflicto son inferidos (elegidos) como índices de árbitro. Si se especifica un predicado_índice, este debe, como un requisito adicional para la inferencia, satisfacer los índices de árbitro. Ten en cuenta que esto significa que se inferirá un índice único no parcial (un índice único sin predicado) (y, por lo tanto, lo utilizará ON CONFLICT) si se dispone de tal índice que cumpla con todos los demás criterios. Si un intento de inferencia no tiene éxito, se produce un error.

ON CONFLICT DO UPDATE garantiza un resultado atómico de INSERT o UPDATE; siempre que no haya un error independiente, uno de esos dos resultados está garantizado, incluso bajo alta concurrencia. Esto también se conoce como UPSERTUPDATE o INSERT.

destino_conflicto

Especifica sobre qué conflictos toma la acción alternativa ON CONFLICT mediante la elección de los índices de árbitro. Realiza una inferencia de índice único, o nombra una restricción de forma explícita. Para ON CONFLICT DO NOTHING, es opcional especificar un destino_conflicto; cuando se omite, se manejan los conflictos con todas las restricciones útiles (e índices únicos). Para ON CONFLICT DO UPDATE, se debe proporcionar un destino_conflicto.

acción_conflicto

acción_conflicto especifica una acción alternativa de ON CONFLICT. Puede ser DO NOTHING, o una cláusula DO UPDATE que especifique los detalles exactos de la acción UPDATE que se realizará en caso de conflicto. Las cláusulas SET y WHERE en ON CONFLICT DO UPDATE tienen acceso a la fila existente utilizando el nombre de la tabla (o un alias), y a la fila propuesta para su inserción utilizando la tabla especial excluded. Se requiere el privilegio SELECT en cualquier columna de la tabla de de destino donde se lean las correspondientes columnas de excluded.

Ten en cuenta que los efectos de todos los disparadores BEFORE INSERT por fila se reflejan en los valores de excluded, ya que esos efectos pueden haber contribuido a que la fila fuera excluida de la inserción.

nombre_columna_índice

El nombre de una columna de nombre_tabla. Se utiliza para inferir los índices del árbitro. Sigue el formato de CREATE INDEX. Se requiere el privilegio SELECT en nombre_columna_índice.

expresión_índice

Similar a nombre_columna_índice, pero se utiliza para inferir expresiones en las columnas de nombre_tabla que aparecen dentro de las definiciones de índice (no columnas simples). Sigue el formato de CREATE INDEX. Se requiere el privilegio SELECT en cualquier columna que aparezca dentro de la expresión_índice.

colación

Cuando se especifica, exige que la correspondiente nombre_columna_índice o expresión_índice utilice una colación particular para coincidir durante la inferencia. Normalmente esto se omite, ya que las colaciones no suelen afectar si se produce o no una violación de restricción. Sigue el formato de CREATE INDEX.

clase_operadores

Cuando se especifica, exige que la correspondiente nombre_columna_índice o expresión_índice utilice una clase de operadores particular para coincidir durante la inferencia. Normalmente esto se omite, ya que la semántica de la igualdad suele ser equivalente en las clases de operadores de un tipo de todos modos, o porque es suficiente confiar en que los índices únicos definidos tienen la definición pertinente de igualdad. Sigue el formato de CREATE INDEX.

predicado_índice

Se utiliza para permitir la inferencia de índices únicos parciales. Se puede inferir cualquier índice que cumpla con el predicado (que no necesita ser realmente un índice parcial). Sigue el formato de CREATE INDEX. Se requiere el privilegio SELECT en cualquier columna que aparezca dentro del predicado_índice.

nombre_restricción

Especifica explícitamente una restricción de árbitro por su nombre, en lugar de inferir una restricción o índice.

condición

Una expresión que devuelve un valor de tipo boolean. Solo se actualizarán las filas para las cuales esta expresión devuelva true, aunque todas las filas se bloquearán cuando se tome la acción ON CONFLICT DO UPDATE. Ten en cuenta que la condición se evalúa al final, después de que se ha identificado un conflicto como candidato para actualizar.

Ten en cuenta que las restricciones de exclusión no se admiten como árbitros con ON CONFLICT DO UPDATE. En todos los casos, solo se admiten restricciones NOT DEFERRABLE e índices únicos como árbitros.

INSERT con una cláusula ON CONFLICT DO UPDATE es una sentencia determinista. Esto significa que no se permitirá que el comando afecte a ninguna fila existente individual más de una vez; se generará un error de violación de cardinalidad cuando surja esta situación. Las filas propuestas para la inserción no deben duplicarse entre sí en términos de atributos restringidos por un índice o restricción de árbitro.

Ten en cuenta que actualmente no se admite que la cláusula ON CONFLICT DO UPDATE de un INSERT aplicado a una tabla particionada actualice la clave de partición de una fila en conflicto de tal manera que requiera que la fila se mueva a una nueva partición.

Tip

A menudo es preferible utilizar la inferencia de índice único en lugar de nombrar una restricción directamente utilizando ON CONFLICT ON CONSTRAINT nombre_restricción. La inferencia continuará funcionando correctamente cuando el índice subyacente se reemplace por otro más o menos equivalente de manera superpuesta, por ejemplo, al usar CREATE UNIQUE INDEX ... CONCURRENTLY antes de eliminar el índice que se está reemplazando.

Warning

Mientras se ejecuta CREATE INDEX CONCURRENTLY o REINDEX CONCURRENTLY en un índice único, las sentencias INSERT ... ON CONFLICT en la misma tabla pueden fallar inesperadamente con una violación de unicidad.

Salidas

Al completarse con éxito, un comando INSERT devuelve una etiqueta de comando de la forma

INSERT oid cantidad

La cantidad es el número de filas insertadas o actualizadas. oid es siempre 0 (solía ser el OID asignado a la fila insertada si la cantidad era exactamente uno y la tabla de destino se declaraba WITH OIDS, y 0 de lo contrario, pero la creación de una tabla WITH OIDS ya no se admite).

Si el comando INSERT contiene una cláusula RETURNING, el resultado será similar al de una sentencia SELECT que contiene las columnas y los valores definidos en la lista RETURNING, calculados sobre la(s) fila(s) insertada(s) o actualizada(s) por el comando.

Notas

Si la tabla especificada es una tabla particionada, cada fila se enruta a la partición adecuada y se inserta en ella. Si la tabla especificada es una partición, se producirá un error si una de las filas de entrada viola la restricción de partición.

También puedes considerar el uso de MERGE, ya que permite mezclar INSERT, UPDATE y DELETE dentro de una sola sentencia. Consulta la MERGE.

Ejemplos

Insertar una sola fila en la tabla films:

INSERT INTO films VALUES
    ('UA502', 'Bananas', 105, '1971-07-13', 'Comedy', '82 minutes');

En este ejemplo, la columna len se omite y, por lo tanto, tendrá el valor por omisión:

INSERT INTO films (code, title, did, date_prod, kind)
    VALUES ('T_601', 'Yojimbo', 106, '1961-06-16', 'Drama');

Este ejemplo utiliza la cláusula DEFAULT para las columnas de fecha en lugar de especificar un valor:

INSERT INTO films VALUES
    ('UA502', 'Bananas', 105, DEFAULT, 'Comedy', '82 minutes');
INSERT INTO films (code, title, did, date_prod, kind)
    VALUES ('T_601', 'Yojimbo', 106, DEFAULT, 'Drama');

Para insertar una fila que consiste enteramente en valores por omisión:

INSERT INTO films DEFAULT VALUES;

Para insertar varias filas utilizando la sintaxis VALUES de múltiples filas:

INSERT INTO films (code, title, did, date_prod, kind) VALUES
    ('B6717', 'Tampopo', 110, '1985-02-10', 'Comedy'),
    ('HG120', 'The Dinner Game', 140, DEFAULT, 'Comedy');

Este ejemplo inserta algunas filas en la tabla films desde una tabla tmp_films con el mismo diseño de columnas que films:

INSERT INTO films SELECT * FROM tmp_films WHERE date_prod < '2004-05-07';

Este ejemplo inserta en columnas de matriz (array):

-- Crear un tablero de tres en línea (tictactoe) de 3x3 vacío
INSERT INTO tictactoe (game, board[1:3][1:3])
    VALUES (1, '{{" "," "," "},{" "," "," "},{" "," "," "}}');
-- Los subíndices en el ejemplo anterior no son realmente necesarios
INSERT INTO tictactoe (game, board)
    VALUES (2, '{{X," "," "},{" ",O," "},{" ",X," "}}');

Insertar una sola fila en la tabla distributors, devolviendo el número de secuencia generado por la cláusula DEFAULT:

INSERT INTO distributors (did, dname) VALUES (DEFAULT, 'XYZ Widgets')
   RETURNING did;

Incrementar el conteo de ventas del vendedor que gestiona la cuenta de Acme Corporation, y registrar toda la fila actualizada junto con la hora actual en una tabla de registro:

WITH upd AS (
  UPDATE employees SET sales_count = sales_count + 1 WHERE id =
    (SELECT sales_person FROM accounts WHERE name = 'Acme Corporation')
    RETURNING *
)
INSERT INTO employees_log SELECT *, current_timestamp FROM upd;

Insertar o actualizar nuevos distribuidores según corresponda. Asume que se ha definido un índice único que restringe los valores que aparecen en la columna did. Ten en cuenta que se utiliza la tabla especial excluded para hacer referencia a los valores originalmente propuestos para la inserción:

INSERT INTO distributors (did, dname)
    VALUES (5, 'Gizmo Transglobal'), (6, 'Associated Computing, Inc')
    ON CONFLICT (did) DO UPDATE SET dname = EXCLUDED.dname;

Insertar o actualizar nuevos distribuidores como en el caso anterior, devolviendo información sobre los valores existentes que se actualizaron, junto con los nuevos datos insertados. Ten en cuenta que los valores devuelvos para old_did y old_dname serán NULL para las filas que no estén en conflicto:

INSERT INTO distributors (did, dname)
    VALUES (5, 'Gizmo Transglobal'), (6, 'Associated Computing, Inc')
    ON CONFLICT (did) DO UPDATE SET dname = EXCLUDED.dname
    RETURNING old.did AS old_did, old.dname AS old_dname,
              new.did AS new_did, new.dname AS new_dname;

Insertar un distribuidor, o no hacer nada para las filas propuestas para la inserción cuando existe una fila excluida existente (una fila con una columna o columnas restringidas que coinciden después de que se ejecuten los disparadores before row insert). El ejemplo asume que se ha definido un índice único que restringe los valores que aparecen en la columna did:

INSERT INTO distributors (did, dname) VALUES (7, 'Redline GmbH')
    ON CONFLICT (did) DO NOTHING;

Insertar o actualizar nuevos distribuidores según corresponda. El ejemplo asume que se ha definido un índice único que restringe los valores que aparecen en la columna did. La cláusula WHERE se utiliza para limitar las filas realmente actualizadas (sin embargo, cualquier fila existente no actualizada se seguirá bloqueando):

-- No actualizar los distribuidores existentes basados en un determinado código postal
INSERT INTO distributors AS d (did, dname) VALUES (8, 'Anvil Distribution')
    ON CONFLICT (did) DO UPDATE
    SET dname = EXCLUDED.dname || ' (formerly ' || d.dname || ')'
    WHERE d.zipcode <> '21201';

-- Nombra una restricción directamente en la sentencia (utiliza el índice asociado
-- para arbitrar la acción DO NOTHING)
INSERT INTO distributors (did, dname) VALUES (9, 'Antwerp Design')
    ON CONFLICT ON CONSTRAINT distributors_pkey DO NOTHING;

Insertar un nuevo distribuidor si es posible; de lo contrario, DO NOTHING. El ejemplo asume que se ha definido un índice único que restringe los valores que aparecen en la columna did en un subconjunto de filas donde la columna booleana is_active se evalúa como true:

-- Esta sentencia podría inferir un índice único parcial en «did» con un predicado de
-- «WHERE is_active», pero también podría usar una restricción única regular en «did»
INSERT INTO distributors (did, dname) VALUES (10, 'Conrad International')
    ON CONFLICT (did) WHERE is_active DO NOTHING;

Compatibilidad

INSERT cumple con el estándar SQL, excepto que la cláusula RETURNING es una extensión de PostgreSQL, al igual que la capacidad de usar WITH con INSERT, y la capacidad de especificar una acción alternativa con ON CONFLICT. Asimismo, el estándar no permite omitir la lista de nombres de columnas si no todas las columnas se llenan a partir de la cláusula VALUES o de la consulta. Si prefieres una sentencia que se ajuste más al estándar SQL que ON CONFLICT, consulta la MERGE.

El estándar SQL especifica que OVERRIDING SYSTEM VALUE solo se puede especificar si existe una columna de identidad que se genera siempre. PostgreSQL permite la cláusula en cualquier caso y la ignora si no es aplicable.

Las posibles limitaciones de la cláusula de consulta están documentadas en la SELECT.