Articulo de referencia

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 siguie...

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:

  • Utilizar un procedimiento almacenado específico de la base de datos que genera la clave sustituta, realiza la operación INSERT y, finalmente, devuelve la clave generada. Por ejemplo, en Microsoft SQL Server, la clave se recupera mediante la función especial SCOPE_IDENTITY() , mientras que en SQLite la función se denomina last_insert_rowid() .
  • Utilizar una sentencia SELECT específica de la base de datos en una tabla temporal que contiene las últimas filas insertadas. Db2 implementa esta función de la siguiente manera:
    SELECCIONAR * DE NUEVA TABLA ( INSERTAR EN VALORES de la libreta telefónica ( 'Peter Doe' , '555-2323' ) ) COMO t 
       
          
           
      
    
    • Db2 para z/OS implementa esta característica de la siguiente manera.
      SELECCIONAR EMPNO , HIRETYPE , HIREDATE DE LA TABLA FINAL ( INSERTAR EN EMPSAMP ( NOMBRE , SALARIO , DEPTNO , NIVEL ) VALORES ( ' Mary Smith' , 35000.00 , 11 , 'Asociado' ) );   
         
                
             
      
      
  • Utilizar una instrucción SELECT después de la instrucción INSERT con una función específica de la base de datos que devuelve la clave principal generada para la fila insertada más recientemente. Por ejemplo, LAST_INSERT_ID() para MySQL .
  • Utilizar una combinación única de elementos de la instrucción SQL INSERT original en una instrucción SELECT posterior .
  • Usar un GUID en la instrucción INSERT de SQL y recuperarlo en una instrucción SELECT .
  • Uso de la cláusula OUTPUT en la instrucción SQL INSERT para MS-SQL Server 2005 y MS-SQL Server 2008.
  • Uso de una declaración INSERT con cláusula RETURNING para Oracle .
    INSERTAR EN VALORES de la libreta telefónica ( 'Peter Doe' , '555-2323' ) DEVOLVER id de la libreta telefónica EN v_pb_id      
       
    
  • Uso de una sentencia INSERT con cláusula RETURNING para PostgreSQL (desde la versión 8.2). La lista devuelta es idéntica al resultado de una sentencia INSERT .
    • Firebird tiene la misma sintaxis en las sentencias de lenguaje de modificación de datos (DSQL); la sentencia puede agregar como máximo una fila. [2] En los procedimientos almacenados, disparadores y bloques de ejecución (PSQL) se utiliza la sintaxis Oracle antes mencionada. [3]
      INSERTAR EN VALORES de la libreta telefónica ( 'Peter Doe' , '555-2323' ) DEVOLVIENDO id de la libreta telefónica      
       
      
  • El uso de la función IDENTITY() en H2 devuelve la última identidad insertada.
    SELECCIONAR IDENTIDAD (); 
    

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".
  • Sentencia INSERT de Oracle SQL (Oracle Database SQL Language Reference, 11g Release 2 (11.2) en oracle.com)
  • Ejemplos de consultas de anexión de Microsoft Access y sintaxis de consultas SQL INSERT
  • Sentencia INSERT de MySQL (Manual de referencia de MySQL 5.5)
Obtenido de "https://es.wikipedia.org/w/index.php?title=Insertar_(SQL)&oldid=1169948818"