stringtranslate.com

Insertar (SQL)

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

Forma básica

Las declaraciones de inserción tienen el siguiente formato:

INSERTAR EN 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 para la columna. Los valores especificados (o implícitos) por la instrucción INSERT deben satisfacer todas las restricciones aplicables (como claves principales , restricciones CHECK y restricciones NOT NULL ). Si se produce un error de sintaxis o si se infringe alguna restricción, la nueva fila no se agrega a la tabla y, en su lugar, se devuelve un error.

Ejemplo:

INSERTAR EN phone_book ( nombre , número ) VALORES ( 'John Doe' , '555-1212' );       

También se puede utilizar una abreviatura, 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 phone_book e ignorar cualquier otra columna que pueda estar después de las primeras 2 en la tabla.

INSERTAR EN phone_book VALORES ( '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 sola declaración SQL:

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

Esta función 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 (suponiendo que 'nombre' y 'número' son las únicas columnas en la tabla 'phone_book'):

INSERTAR EN phone_book VALORES ( 'John Doe' , '555-1212' ), ( 'Peter Doe' , '555-2323' );       

que puede verse como una abreviatura de las dos afirmaciones

INSERTAR EN los VALORES de la libreta telefónica ( 'Juan Pérez' , '555-1212' ); INSERTAR EN los VALORES de la libreta telefónica ( 'Pedro Pérez' , '555-2323' );          

Tenga en cuenta que las dos declaraciones separadas pueden tener semánticas diferentes (especialmente con respecto a los activadores de declaraciones ) y pueden no proporcionar el mismo rendimiento que una única inserción de varias filas.

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

INSERTAR EN la libreta telefónica SELECCIONAR 'John Doe' , '555-1212' UNION ALL 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 utilice la tabla DUAL , que siempre consta de una sola fila:

INSERTAR EN la libreta telefónica SELECCIONAR 'John Doe' , '555-1212' DE DUAL UNION ALL SELECCIONAR 'Peter Doe' , '555-2323' DE DUAL          

Una implementación de esta lógica que cumple con los estándares muestra el siguiente ejemplo, o como se muestra arriba:

INSERTAR EN libreta_telefonica SELECCIONAR 'Juan Pérez' , '555-1212' DE LATERAL ( VALORES ( 1 ) ) COMO t ( c ) UNIÓN TODO SELECCIONAR 'Pedro Pérez' , '555-2323' DE LATERAL ( VALORES ( 1 ) ) COMO t ( c )                      

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

INSERTAR TODO EN los VALORES de la libreta telefónica ( 'John Doe' , '555-1212' ) EN los VALORES de la libreta telefónica ( 'Peter Doe' , '555-2323' ) SELECCIONAR * DE DUAL ;            

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

INSERTAR EN phone_book ( nombre , número ) SELECCIONAR 'John Doe' , '555-1212' DE RDB$DATABASE UNION ALL SELECCIONAR 'Peter Doe' , '555-2323' DE RDB$DATABASE ;             

Firebird, sin embargo, restringe el número 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

Una sentencia INSERT también se puede utilizar para recuperar datos de otras tablas, modificarlos si es necesario e insertarlos directamente en la tabla. Todo esto se hace en una única sentencia SQL que no implica ningún procesamiento intermedio en la aplicación cliente. Se utiliza una subselección en lugar de la cláusula VALUES . La subselección puede contener uniones, 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 phone_book2 SELECCIONAR * DE phone_book DONDE nombre EN ( 'John Doe' , 'Peter Doe' )        

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

INSERTAR EN phone_book2 ( nombre , número ) SELECCIONAR nombre , número DE phone_book 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 instrucció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 LIBRETA TELEFÓNICA ( 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 utilizar DEFAULT VALUES en lugar de VALUES(DEFAULT) . La palabra clave DEFAULT también se puede utilizar en la inserción normal para completar explícitamente una columna utilizando el valor predeterminado de esa columna:

INSERTAR EN VALORES DE LA LIBRETA TELEFÓNICA ( 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 la columna con un valor en blanco (excepto cuando estén 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 ocasionalmente con la situación en la que necesitan recuperar automáticamente la clave principal generada por la base de datos a partir de una sentencia SQL INSERT para usarla en otras sentencias SQL. La mayoría de los sistemas no permiten que las sentencias SQL INSERT devuelvan datos de fila. Por lo tanto, resulta necesario implementar una solución alternativa en tales situaciones. Las implementaciones comunes incluyen:

Desencadenantes

Si se definen activadores en la tabla en la que opera la sentencia INSERT , dichos activadores se evalúan en el contexto de la operación. Los activadores BEFORE INSERT permiten modificar los valores que se insertarán en la tabla. Los activadores AFTER INSERT ya no pueden modificar los datos, pero se pueden utilizar para iniciar acciones en otras tablas, por ejemplo, para implementar un mecanismo de auditoría.

Referencias

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

Enlaces externos