INSERTAR: crea nuevas filas en una tabla
Sinopsis
[WITH[ RECURSIVE ] with_query [,...]]INSERTINTO table_name [AS alias ][( column_name [,...])][ OVERRIDING USER VALUE] query [ON CONFLICT [ conflict_target ] conflict_action ][RETURNING*| output_expression [[AS] output_name ][,...]]where conflict_target can be one of: ( index_column_name [COLLATE collation ][ opclass ][,...])[WHERE index_predicate ]ONCONSTRAINT constraint_name and conflict_action is one of: DO NOTHING DOUPDATESET ( column_name [,...])=[ROW]( DEFAULT [,...]) [,...][WHERE condition ]
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 columna, el valor predeterminado son todas las columnas de la tabla en su orden declarado; o el primero N
nombres de columna, si solo hay N
columnas suministradas por el VALUES
cláusula o query
. Los valores proporcionados por el VALUES
cláusula o query
están asociados 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ícitas o implícitas se completará con un valor predeterminado, ya sea su valor predeterminado declarado o nulo si no hay ninguno.
Si la expresión de cualquier columna no es del tipo de datos correcto, se intentará la conversión automática de tipos.
ON CONFLICT
se puede utilizar para especificar una acción alternativa para generar una restricción única o un error de violación de restricción de exclusión. (Consulte la cláusula SOBRE CONFLICTO a continuación).
El opcional RETURNING
causas de la cláusula INSERT
para calcular y devolver valores basados en cada fila realmente insertada (o actualizada, si un ON CONFLICT DO UPDATE
se utilizó la cláusula). Esto es principalmente útil para obtener valores que fueron proporcionados por valores predeterminados, como un número de secuencia de serie. Sin embargo, se permite cualquier expresión que utilice las columnas de la tabla. La sintaxis del RETURNING
lista es idéntica a la de la lista de salida de SELECT
. Solo se devolverán las filas que se insertaron o actualizaron correctamente. Por ejemplo, si una fila se bloqueó pero no se actualizó porque un ON CONFLICT DO UPDATE ... WHERE
cláusula condition
no quedó satisfecho, la fila no se devolverá.
Debes tener INSERT
privilegio sobre una mesa para insertar en ella. Si ON CONFLICT DO UPDATE
está presente, UPDATE
También se requiere privilegio sobre la mesa.
Si se especifica una lista de columnas, solo necesita INSERT
privilegio en las columnas enumeradas. Del mismo modo, cuando ON CONFLICT DO UPDATE
se especifica, solo necesitas UPDATE
privilegio en la (s) columna (s) que se enumeran para actualizar. Sin embargo, ON CONFLICT DO UPDATE
también requiere SELECT
privilegio en cualquier columna cuyos valores se leen en el ON CONFLICT DO UPDATE
expresiones o condition
.
Uso del RETURNING
la cláusula requiere SELECT
privilegio en todas las columnas mencionadas en RETURNING
. Si usa el query
cláusula para insertar filas de una consulta, por supuesto, debe tener SELECT
privilegio sobre cualquier tabla o columna utilizada en la consulta.
Parámetros
Insertar
Esta sección cubre los parámetros que pueden usarse cuando solo se insertan nuevas filas. Parámetros exclusivamente usado con el ON CONFLICT
cláusula se describen por separado.
with_query
-
los
WITH
La cláusula le permite especificar una o más subconsultas a las que se puede hacer referencia por nombre en laINSERT
consulta. Consulte la Sección 7.8 y SELECT para obtener más detalles.Es posible que el
query
(SELECT
declaración) para contener también unWITH
cláusula. En tal caso, ambos conjuntos dewith_query
se puede hacer referencia dentro de laquery
, pero el segundo tiene prioridad ya que está más anidado. table_name
-
El nombre (opcionalmente calificado por esquema) de una tabla existente.
alias
-
Un nombre sustituto para
table_name
. Cuando se proporciona un alias, oculta completamente el nombre real de la tabla. Esto es particularmente útil cuandoON CONFLICT DO UPDATE
apunta a una tabla llamadaexcluded
, ya que de lo contrario se tomará como el nombre de la tabla especial que representa las filas propuestas para la inserción. column_name
-
El nombre de una columna en la tabla nombrada por
table_name
. El nombre de la columna se puede calificar con un nombre de subcampo o un subíndice de matriz, si es necesario. (Insertar solo en algunos campos de una columna compuesta deja los otros campos nulos). Cuando se hace referencia a una columna conON CONFLICT DO UPDATE
, no incluya el nombre de la tabla en la especificación de una columna de destino. Por ejemplo,INSERT INTO table_name ... ON CONFLICT DO UPDATE SET table_name.col = 1
no es válido (esto sigue el comportamiento general paraUPDATE
). OVERRIDING SYSTEM VALUE
-
Si se especifica esta cláusula, los valores proporcionados para las columnas de identidad anularán los valores generados por la secuencia predeterminada.
Para una columna de identidad definida como
GENERATED ALWAYS
, es un error insertar un valor explícito (que no seaDEFAULT
) sin especificarOVERRIDING SYSTEM VALUE
oOVERRIDING USER VALUE
. (Para una columna de identidad definida comoGENERATED BY DEFAULT
,OVERRIDING SYSTEM VALUE
es el comportamiento normal y especificarlo no hace nada, pero PostgreSQL lo permite como una extensión). OVERRIDING USER VALUE
-
Si se especifica esta cláusula, se ignoran los valores proporcionados para las columnas de identidad y se aplican los valores generados por la secuencia predeterminada.
Esta cláusula es útil, por ejemplo, al copiar valores entre tablas. Escribiendo
INSERT INTO tbl2 OVERRIDING USER VALUE SELECT * FROM tbl1
copiará detbl1
todas las columnas que no son columnas de identidad entbl2
mientras que los valores de las columnas de identidad entbl2
será generado por las secuencias asociadas contbl2
. DEFAULT VALUES
-
Todas las columnas se llenarán con sus valores predeterminados, como si
DEFAULT
se especificaron explícitamente para cada columna. (UnOVERRIDING
cláusula no está permitida en este formulario.) expression
-
Una expresión o valor para asignar a la columna correspondiente.
DEFAULT
-
La columna correspondiente se llenará con su valor predeterminado. 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 especifica el comportamiento normal de calcular la columna a partir de su expresión de generación.
query
-
Una consulta (
SELECT
declaración) que proporciona las filas que se van a insertar. Consulte la instrucción SELECT para obtener una descripción de la sintaxis. output_expression
-
Una expresión que será calculada y devuelta por el
INSERT
comando después de insertar o actualizar cada fila. La expresión puede usar cualquier nombre de columna de la tabla nombrada portable_name
. Escribir*
para devolver todas las columnas de las filas insertadas o actualizadas. output_name
-
Un nombre que se utilizará para una columna devuelta.
ON CONFLICT
Cláusula
El opcional ON CONFLICT
cláusula especifica una acción alternativa para generar una infracción única o un error de infracción de restricción de exclusión. Para cada fila individual propuesta para la inserción, la inserción prosigue o, si un árbitro restricción o índice especificado por conflict_target
es violada, la alternativa conflict_action
se toma. ON CONFLICT DO NOTHING
simplemente evita insertar una fila como acción alternativa. ON CONFLICT DO UPDATE
actualiza la fila existente que entra en conflicto con la fila propuesta para la inserción como acción alternativa.
conflict_target
puede realizar inferencia de índice único. Al realizar inferencia, consta de uno o más index_column_name
columnas y / o index_expression
expresiones y un opcional index_predicate
. Todos table_name
índices únicos que, independientemente del orden, contienen exactamente el conflict_target
-Las columnas / expresiones especificadas se infieren (se eligen) como índices de árbitro. Si una index_predicate
se especifica, debe, como un requisito adicional para la inferencia, satisfacer los índices de árbitro. Tenga en cuenta que esto significa que un índice único no parcial (un índice único sin un predicado) será inferido (y por lo tanto utilizado por ON CONFLICT
) si se dispone de un índice que satisfaga todos los demás criterios. Si un intento de inferencia no tiene éxito, se genera un error.
ON CONFLICT DO UPDATE
garantiza un atómico INSERT
o UPDATE
Salir; siempre que no haya un error independiente, uno de esos dos resultados está garantizado, incluso con una alta concurrencia. Esto también se conoce como UPSERT – “ACTUALIZAR o INSERTAR“.
conflict_target
-
Especifica qué conflictos
ON CONFLICT
toma la acción alternativa eligiendo índices de árbitro. O realiza inferencia de índice único, o nombra una restricción explícitamente. ParaON CONFLICT DO NOTHING
, es opcional especificar unconflict_target
; cuando se omite, se manejan los conflictos con todas las restricciones utilizables (e índices únicos). ParaON CONFLICT DO UPDATE
, aconflict_target
debe ser proporcionado. conflict_action
-
conflict_action
especifica una alternativaON CONFLICT
acción. Puede serDO NOTHING
o unDO UPDATE
cláusula que especifica los detalles exactos de laUPDATE
acción a realizar en caso de conflicto. losSET
yWHERE
cláusulas enON CONFLICT DO UPDATE
tener acceso a la fila existente usando el nombre de la tabla (o un alias), y a las filas propuestas para la inserción usando el especialexcluded
mesa.SELECT
Se requiere privilegio en cualquier columna de la tabla de destino donde correspondaexcluded
se leen las columnas.Tenga en cuenta que los efectos de todos por fila
BEFORE INSERT
los desencadenantes se reflejan enexcluded
valores, ya que esos efectos pueden haber contribuido a que la fila se excluya de la inserción. index_column_name
-
El nombre de un
table_name
columna. Se utiliza para inferir índices de árbitro. SigueCREATE INDEX
formato.SELECT
privilegio enindex_column_name
es requerido. index_expression
-
Similar a
index_column_name
, pero se usa para inferir expresiones entable_name
columnas que aparecen dentro de las definiciones de índice (no columnas simples). SigueCREATE INDEX
formato.SELECT
privilegio en cualquier columna que aparezca dentroindex_expression
es requerido. collation
-
Cuando se especifica, ordena que corresponda
index_column_name
oindex_expression
utilice una colación particular para que se hagan coincidir durante la inferencia. Por lo general, esto se omite, ya que las intercalaciones generalmente no afectan si se produce o no una infracción de la restricción. SigueCREATE INDEX
formato. opclass
-
Cuando se especifica, ordena que corresponda
index_column_name
oindex_expression
use una clase de operador particular para que coincida durante la inferencia. Por lo general, esto se omite, ya que igualdad La semántica a menudo es equivalente en todas las clases de operador de un tipo de todos modos, o porque es suficiente confiar en que los índices únicos definidos tienen la definición pertinente de igualdad. SigueCREATE INDEX
formato. index_predicate
-
Se utiliza para permitir la inferencia de índices únicos parciales. Se puede inferir cualquier índice que satisfaga el predicado (que en realidad no tiene por qué ser índices parciales). Sigue
CREATE INDEX
formato.SELECT
privilegio en cualquier columna que aparezca dentroindex_predicate
es requerido. constraint_name
-
Especifica explícitamente un árbitro restricción por nombre, en lugar de inferir una restricción o índice.
condition
-
Una expresión que devuelve un valor de tipo
boolean
. Solo filas para las que devuelve esta expresióntrue
se actualizará, aunque todas las filas se bloqueará cuando elON CONFLICT DO UPDATE
se toma acción. Tenga en cuenta quecondition
se evalúa en último lugar, después de que se haya identificado un conflicto como candidato a actualizar.
Tenga en cuenta que las restricciones de exclusión no se admiten como árbitros con ON CONFLICT DO UPDATE
. En todos los casos, solo NOT DEFERRABLE
las restricciones y los índices únicos se admiten como árbitros.
INSERT
con un ON CONFLICT DO UPDATE
la cláusula es una “determinista“ declaración. Esto significa que no se permitirá que el comando afecte a ninguna fila existente 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.
Tenga en cuenta que actualmente no es compatible con ON CONFLICT DO UPDATE
cláusula de un INSERT
aplicado a una tabla particionada para actualizar la clave de partición de una fila en conflicto de modo que requiera que la fila se mueva a una nueva partición.
Propina
A menudo es preferible usar inferencia de índice único en lugar de nombrar una restricción directamente usando
ON CONFLICT ON CONSTRAINT
constraint_name
. La inferencia seguirá funcionando correctamente cuando el índice subyacente se sustituya por otro índice más o menos equivalente de forma superpuesta, por ejemplo, al utilizarCREATE UNIQUE INDEX ... CONCURRENTLY
antes de dejar caer el índice que se está reemplazando.
Salidas
Una vez completado con éxito, INSERT
comando devuelve una etiqueta de comando de la forma
INSERT oid count
los count
es el número de filas insertadas o actualizadas. oid
es siempre 0 (solía ser el OID asignado a la fila insertada si count
era exactamente uno y la tabla de destino se declaró WITH OIDS
y 0 en caso contrario, pero creando una tabla WITH OIDS
ya no es compatible).
Si el INSERT
El comando contiene un RETURNING
cláusula, el resultado será similar al de una SELECT
declaración que contiene las columnas y valores definidos en el RETURNING
lista, calculada sobre las filas insertadas o actualizadas por el comando.
Notas
Si la tabla especificada es una tabla particionada, cada fila se enruta a la partición apropiada 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 la partición.
Ejemplos de
Insertar una sola fila en la tabla films
:
INSERTINTO films VALUES('UA502','Bananas',105,'1971-07-13','Comedy','82 minutes');
En este ejemplo, el len
La columna se omite y, por lo tanto, tendrá el valor predeterminado:
INSERTINTO films (code, title, did, date_prod, kind)VALUES('T_601','Yojimbo',106,'1961-06-16','Drama');
Este ejemplo usa el DEFAULT
cláusula para las columnas de fecha en lugar de especificar un valor:
INSERTINTO films VALUES('UA502','Bananas',105,DEFAULT,'Comedy','82 minutes');INSERTINTO films (code, title, did, date_prod, kind)VALUES('T_601','Yojimbo',106,DEFAULT,'Drama');
Para insertar una fila que consta en su totalidad de valores predeterminados:
INSERTINTO films DEFAULTVALUES;
Para insertar varias filas usando la fila múltiple VALUES
sintaxis:
INSERTINTO 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
de una mesa tmp_films
con el mismo diseño de columna que films
:
INSERTINTO films SELECT*FROM tmp_films WHERE date_prod <'2004-05-07';
Este ejemplo se inserta en columnas de matriz:
-- Create an empty 3x3 gameboard for noughts-and-crossesINSERTINTO tictactoe (game, board[1:3][1:3])VALUES(1,'" "," "," "," "," "," "," "," "," "');-- The subscripts in the above example aren't really neededINSERTINTO tictactoe (game, board)VALUES(2,'X," "," "," ",O," "," ",X," "');
Insertar una sola fila en la tabla distributors
, devolviendo el número de secuencia generado por el DEFAULT
cláusula:
INSERTINTO distributors (did, dname)VALUES(DEFAULT,'XYZ Widgets')RETURNING did;
Aumente el recuento de ventas del vendedor que administra la cuenta de Acme Corporation y registre toda la fila actualizada junto con la hora actual en una tabla de registro:
WITH upd AS(UPDATE employees SET sales_count = sales_count +1WHERE id =(SELECT sales_person FROM accounts WHERE name ='Acme Corporation')RETURNING*)INSERTINTO employees_log SELECT*,current_timestampFROM upd;
Inserte o actualice nuevos distribuidores según corresponda. Supone que se ha definido un índice único que restringe los valores que aparecen en el did
columna. Tenga en cuenta que el especial excluded
La tabla se utiliza para hacer referencia a los valores propuestos originalmente para la inserción:
INSERTINTO distributors (did, dname)VALUES(5,'Gizmo Transglobal'),(6,'Associated Computing, Inc')ON CONFLICT (did)DOUPDATESET dname = EXCLUDED.dname;
Inserte un distribuidor o no haga nada por las filas propuestas para la inserción cuando exista una fila excluida existente (una fila con una columna o columnas restringidas coincidentes antes de que la inserción de filas active el disparo). El ejemplo asume que se ha definido un índice único que restringe los valores que aparecen en el did
columna:
INSERTINTO distributors (did, dname)VALUES(7,'Redline GmbH')ON CONFLICT (did)DO NOTHING;
Inserte o actualice nuevos distribuidores según corresponda. El ejemplo asume que se ha definido un índice único que restringe los valores que aparecen en el did
columna. WHERE
La cláusula se usa para limitar las filas realmente actualizadas (sin embargo, cualquier fila existente no actualizada seguirá bloqueada):
-- Don't update existing distributors based in a certain ZIP codeINSERTINTO distributors AS d (did, dname)VALUES(8,'Anvil Distribution')ON CONFLICT (did)DOUPDATESET dname = EXCLUDED.dname ||' (formerly '|| d.dname ||')'WHERE d.zipcode <>'21201';-- Name a constraint directly in the statement (uses associated-- index to arbitrate taking the DO NOTHING action)INSERTINTO distributors (did, dname)VALUES(9,'Antwerp Design')ON CONFLICT ONCONSTRAINT distributors_pkey DO NOTHING;
Inserte 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 el did
columna en un subconjunto de filas donde el is_active
La columna booleana se evalúa como true
:
-- This statement could infer a partial unique index on "did"-- with a predicate of "WHERE is_active", but it could also-- just use a regular unique constraint on "did"INSERTINTO 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 el RETURNING
la cláusula 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
. Además, el caso en el que se omite una lista de nombres de columna, pero no todas las columnas se llenan desde el VALUES
cláusula o query
, no está permitido por el estándar.
El estándar SQL especifica que OVERRIDING SYSTEM VALUE
solo se puede especificar si siempre existe una columna de identidad que se genera. PostgreSQL permite la cláusula en cualquier caso y la ignora si no es aplicable.
Posibles limitaciones del query
cláusula están documentados en SELECT.
Anterior | Hasta | próximo |
ESQUEMA EXTRANJERO DE IMPORTACIÓN | Hogar | ESCUCHA |
valoraciones y reseñas
Si entiendes que ha sido de provecho nuestro post, sería de mucha ayuda si lo compartieras con más seniors así contrubuyes a dar difusión a esta información.