INSERT — crear nuevas filas en una tabla
[ WITH [ RECURSIVE ]consulta_with[, ...] ] INSERT INTOnombre_tabla[ ASalias] [ (nombre_columna[, ...] ) ] [ OVERRIDING { SYSTEM | USER } VALUE ] { DEFAULT VALUES | VALUES ( {expresión| DEFAULT } [, ...] ) [, ...] |consulta} [ ON CONFLICT [destino_conflicto]acción_conflicto] [ RETURNING [ WITH ( { OLD | NEW } ASalias_salida[, ...] ) ] { * |expresión_salida[ [ AS ]nombre_salida] } [, ...] ] dondedestino_conflictopuede ser uno de: ( {nombre_columna_índice| (expresión_índice) } [ COLLATEcolación] [clase_operadores] [, ...] ) [ WHEREpredicado_índice] ON CONSTRAINTnombre_restricciónyacción_conflictoes uno de: DO NOTHING DO UPDATE SET {nombre_columna= {expresión| DEFAULT } | (nombre_columna[, ...] ) = [ ROW ] ( {expresión| DEFAULT } [, ...] ) | (nombre_columna[, ...] ) = (sub-SELECT) } [, ...] [ WHEREcondició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.
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_tablaEl 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 VALUESi 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 VALUESi 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ónUna expresión o valor para asignar a la columna correspondiente.
DEFAULTLa 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.
u nombre_columnaOLD.*, y los valores nuevos se pueden devolver escribiendo
NEW.
o nombre_columnaNEW.*. 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_salidaUn nombre para usar en una columna devuelta.
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 UPSERT
— “UPDATE 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ónEspecifica 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.
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.
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.
Al completarse con éxito, un comando INSERT devuelve una etiqueta de
comando de la forma
INSERToidcantidad
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.
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.
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;
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.