stringtranslate.com

Insertar (SQL)

Una instrucción SQL INSERT agrega uno o más registros a cualquier tabla en una base de datos relacional .

Forma básica

Las declaraciones de inserción tienen la siguiente forma:

INSERTAR EN la tabla ( columna1 [, columna2 , columna3 ...]) VALORES ( valor1 [, valor2 , valor3 ...])

El número de columnas y valores debe ser el mismo. Si no se especifica una columna, se utiliza el valor predeterminado de la columna. Los valores especificados (o implícitos) por la instrucción INSERT deben satisfacer todas las restricciones aplicables (como claves primarias , restricciones CHECK y restricciones NOT NULL ). Si se produce un error de sintaxis o si se viola alguna restricción, la nueva fila no se agrega a la tabla y en su lugar se devuelve un error.

Ejemplo:

INSERTAR EN la guía telefónica ( nombre , número ) VALORES ( 'John Doe' , '555-1212' );       

También se puede utilizar taquigrafía, aprovechando el orden de las columnas cuando se creó la tabla. No es necesario especificar todas las columnas de la tabla, ya que cualquier otra columna tomará su valor predeterminado o permanecerá nula :

INSERTAR EN LA tabla VALORES ( valor1 , [ valor2 , ...])

Ejemplo para insertar datos en 2 columnas de la tabla listín telefónico e ignorar cualquier otra columna que pueda estar después de las 2 primeras de la tabla.

INSERTAR EN VALORES de la guía telefónica ( 'John Doe' , '555-1212' );     

Formularios avanzados

Inserciones de varias filas

Una característica de SQL (desde SQL-92 ) es el uso de constructores de valores de fila para insertar varias filas a la vez en una única declaración SQL:

INSERTAR EN nombre de tabla ( columna - a , [ columna - b , ...]) VALORES ( 'valor-1a' , [ 'valor-1b' , ...]), ( 'valor-2a' , [ 'valor- 2b' , ...]), ...            

Esta característica es compatible con IBM Db2 , SQL Server (desde la versión 10.0, es decir, 2008), PostgreSQL (desde la versión 8.2), MySQL , SQLite (desde la versión 3.7.11) y H2 .

Ejemplo (asumiendo que 'nombre' y 'número' son las únicas columnas en la tabla 'directorio_telefónico'):

INSERTAR EN VALORES de la guía telefónica ( 'John Doe' , '555-1212' ), ( 'Peter Doe' , '555-2323' );       

que puede verse como una abreviatura de las dos declaraciones

INSERTAR EN VALORES de la guía telefónica ( 'John Doe' , '555-1212' ); INSERTAR EN VALORES de la guía telefónica ( 'Peter Doe' , '555-2323' );          

Tenga en cuenta que las dos declaraciones separadas pueden tener una semántica diferente (especialmente con respecto a los activadores de declaraciones ) y es posible que no proporcionen el mismo rendimiento que una sola inserción de varias filas.

Para insertar varias filas en MS SQL, puede utilizar esta construcción:

INSERTAR EN la guía telefónica SELECCIONAR 'John Doe' , '555-1212' UNION TODO SELECCIONAR 'Peter Doe' , '555-2323' ;       

Tenga en cuenta que esta no es una declaración SQL válida según el estándar SQL ( SQL:2003 ) debido a la cláusula de subselección incompleta.

Para hacer lo mismo en Oracle use la tabla DUAL , que siempre consta de una sola fila:

INSERTAR EN la guía telefónica SELECCIONAR 'John Doe' , '555-1212' DE DUAL UNION TODO SELECCIONAR 'Peter Doe' , '555-2323' DE DUAL          

Una implementación estándar de esta lógica muestra el siguiente ejemplo, o como se muestra arriba:

INSERTAR EN la guía telefónica SELECCIONAR 'John Doe' , '555-1212' DESDE LATERAL ( VALORES ( 1 ) ) COMO t ( c ) UNIÓN TODOS SELECCIONAR 'Peter Doe' , '555-2323' DESDE LATERAL ( VALORES ( 1 ) ) COMO t ( C )                      

Oracle PL/SQL admite la instrucción INSERT ALL , donde varias instrucciones de inserción terminan con SELECT : [1]

INSERTAR TODO EN LOS VALORES de la libreta de teléfonos ( 'John Doe' , '555-1212' ) EN LOS VALORES de la libreta de teléfonos ( 'Peter Doe' , '555-2323' ) SELECCIONAR * DE DUAL ;            

En Firebird, la inserción de varias filas se puede lograr de esta manera:

INSERTAR EN la guía telefónica ( nombre , número ) SELECCIONE 'John Doe' , '555-1212' DE RDB$DATABASE UNION TODO SELECCIONE 'Peter Doe' , '555-2323' DE RDB$DATABASE ;             

Firebird, sin embargo, restringe la cantidad de filas que se pueden insertar de esta manera, ya que hay un límite en la cantidad de contextos que se pueden usar en una sola consulta.

Copiar filas de otras tablas

También se puede utilizar una declaración INSERT para recuperar datos de otras tablas, modificarlos si es necesario e insertarlos directamente en la tabla. Todo esto se hace en una única declaración SQL que no implica ningún procesamiento intermediario en la aplicación cliente. Se utiliza una subselección en lugar de la cláusula VALUES . La subselección puede contener combinaciones, llamadas a funciones e incluso puede consultar la misma tabla en la que se insertan los datos. Lógicamente, la selección se evalúa antes de que se inicie la operación de inserción real. A continuación se ofrece un ejemplo.

INSERTAR EN agenda_telefónica2 SELECCIONAR * DESDE la agenda_telefónica DONDE nombre EN ( 'John Doe' , 'Peter Doe' )        

Se necesita una variación cuando algunos de los datos de la tabla de origen se insertan en la nueva tabla, pero no todo el registro. (O cuando los esquemas de las tablas no son los mismos).

INSERTAR EN agenda_teléfono2 ( nombre , número ) SELECCIONE nombre , número DE agenda_teléfono DONDE nombre EN ( 'John Doe' , 'Peter Doe' )           

La instrucción SELECT produce una tabla (temporal) y el esquema de esa tabla temporal debe coincidir con el esquema de la tabla donde se insertan los datos.

Valores predeterminados

Es posible insertar una nueva fila sin especificar ningún dato, utilizando valores predeterminados para todas las columnas. Sin embargo, algunas bases de datos rechazan la declaración si no se proporcionan datos, como Microsoft SQL Server, y en este caso se puede utilizar la palabra clave DEFAULT .

INSERTAR EN VALORES de la agenda telefónica ( POR PREDETERMINADO )     

A veces, las bases de datos también admiten una sintaxis alternativa para esto; por ejemplo, MySQL permite omitir la palabra clave DEFAULT y T-SQL puede usar DEFAULT VALUES en lugar de VALUES(DEFAULT) . La palabra clave DEFAULT también se puede utilizar en la inserción normal para rellenar explícitamente una columna utilizando el valor predeterminado de esa columna:

INSERTAR EN VALORES de la guía telefónica ( POR PREDETERMINADO , '555-1212' )       

Lo que sucede cuando una columna no especifica un valor predeterminado depende de la base de datos. Por ejemplo, MySQL y SQLite completarán con un valor en blanco (excepto en modo estricto), mientras que muchas otras bases de datos rechazarán la declaración.

Recuperando la clave

Los diseñadores de bases de datos que utilizan una clave sustituta como clave principal para cada tabla se encontrarán con el escenario ocasional en el que necesitarán recuperar automáticamente la clave principal generada por la base de datos a partir de una instrucción SQL INSERT para usarla en otras declaraciones SQL. La mayoría de los sistemas no permiten que las declaraciones SQL INSERT devuelvan datos de fila. Por lo tanto, se hace necesario implementar una solución alternativa en tales escenarios. Las implementaciones comunes incluyen:

Desencadenantes

Si se definen desencadenadores en la tabla en la que opera la instrucción INSERT , esos desencadenadores se evalúan en el contexto de la operación. Los disparadores ANTES DE INSERTAR permiten modificar los valores que se insertarán en la tabla. Los activadores DESPUÉS DE INSERTAR ya no pueden modificar los datos, pero pueden usarse para iniciar acciones en otras tablas, por ejemplo, para implementar un mecanismo de auditoría.

Referencias

  1. ^ "Oracle PL/SQL: INSERTAR TODO". psoug.org . Archivado desde el original el 16 de septiembre de 2010 . Consultado el 2 de septiembre de 2010 .
  2. ^ "Actualización de referencia del idioma Firebird 2.5" . Consultado el 24 de octubre de 2011 .
  3. ^ "Diccionario de lenguaje SQL Firebird".

enlaces externos