Publicado el 11/06/2004 por Enrique Martínez Montejo. Enlace original

Contenido

  • Introducción
  • Consulta de datos anexados: la instrucción INSERT INTO
    • Consulta de inserción de un único registro
    • Consulta de inserción de múltiples registros
  • Consulta de actualización: la instrucción UPDATE
  • Consulta de eliminación: la instrucción DELETE

Introducción

En el capítulo anterior se estudió la consulta de selección, la cual interrogaba a la base de datos para recuperar un conjunto de registros de una tabla. Pero hay otra serie de sentencias SQL que no devuelven un valor como resultado de la consulta ejecutada, permitiéndonos introducir, modificar o eliminar registros de una tabla. Bajo el nombre genérico de consultas de acción se engloban aquellas sentencias SQL que nos permiten actualizar los datos de una tabla.

Consulta de datos anexados: la instrucción INSERT INTO

Mediante la instrucción INSERT INTO podemos añadir registros a una tabla, construyendo lo que en el argot del lenguaje SQL se conoce como una consulta de datos anexados, la cual presenta dos tipos de sintaxis dependiendo de que la consulta que se desea ejecutar permita la inserción de uno o varios registros.

Pero antes de analizar cada sintaxis por separado, indicaré las precauciones que deberá de tener en cuenta cuando desee ejecutar una consulta de datos anexados, que se aplican a ambos casos y que son las siguientes:

  • Si la tabla de destino contiene una clave principal, procure anexar valores únicos y distintos de NULL en el campo o campos que conformen la clave principal.
  • Igualmente, deberá asegurarse que añade valores únicos en el campo o campos que formen un índice donde no se permita registros duplicados.
  • Deberá de asignar un valor distinto de NULL para aquellos campos de la tabla que sean requeridos.
  • Si la tabla de destino contiene un campo Autonumérico, no incluya dicho campo en la consulta de datos anexados, si desea que el motor Jet enumere automáticamente los registros añadidos. No obstante, si desea conservar los valores originales del campo, deberá de incluir los campos contador en la consulta, no permitiendo el motor Microsoft Jet la inserción de aquellos registros que presenten valores duplicados si el campo Autonumérico es la clave principal de la tabla o forma parte de un índice único.
  • Debido a que la instrucción INSERT INTO no devuelve ningún tipo de resultado, si desea conocer los registros que se añadirán, ejecute primero una consulta de selección que utilice los mismos criterios de selección que la consulta de datos anexados. Una vez ejecutada la consulta de datos añadidos, también puede comprobar los registros afectados por la operación leyendo el valor del parámetro RecordsAffected del objeto Connection o Command de la biblioteca de ADO que haya utilizado para ejecutar la consulta, tal y como se muestra en el siguiente ejemplo:
Dim objCnn As ADODB.Connection
Dim lngRegAfectados As Long

Set objCnn = New ADODB.Connection
With objCnn
    .Provider = "Microsoft.Jet.OLEDB.4.0"
    .ConnectionString = "Data Source = C:\Mis documentos\bdl.mdb"
    ' Abrimos la conexión
    .Open
    ' Ejecutamos la consulta de datos añadidos
    .Execute "INSERT INTO CIientes2 SELECT * FROM Clientes", lngRegAfectados, adCmdText
End With

' Leemos los registros afectados por la operación
MsgBox "Registros afectados: " & lngRegAfectados

Si en lugar de insertar registros a la tabla, desea crear una nueva tabla con los datos de otra tabla, utilice la instrucción SELECT…INTO, la cual se estudió en el apartado Copiar una tabla del Capítulo II.
 

Consulta de inserción de un único registro

Puede utilizar la instrucción INSERT INTO para añadir un único registro a una tabla utilizando para ello la siguiente sintaxis:

INSERT INTO tabla_destino [(campo1[, campo2[, ...]])] VALUES ( valor1[, valor2[, ...])

Esta sintaxis guardará en cada campo especificado el valor indicado en su orden correspondiente: en el campo1 se guardará el valor1; en el campO2 se guardará el valor2, y así sucesivamente.

Los registros que añada se insertarán al final de la tabla, teniendo en cuenta que si omite el nombre de alguna columna en la lista de campos, se insertará en la misma un valor NULL o el valor predeterminado que tenga establecido el campo.

Si omite por completo la lista de campos, la cláusula VALUES deberá incluir un valor para cada campo, y en el mismo orden en el que estos aparecen en la tabla, porque de lo contrario fallará la instrucción INSERT INTO. Puede utilizar tantas instrucciones INSERT INTO adicionales de un único registro para agregar los registros que considere oportunos.

A la hora de especificar los valores de los campos, tenga siempre presente las siguientes normas:

  • Si indica una cadena de caracteres, acote el valor literal entre comillas simples (‘).
  • Si desea incluir una fecha, utilice el formato estándar americano (mes/día/año) entre caracteres almohadilla (#).

El siguiente ejemplo añadirá un nuevo registro, especificando valores solamente para algunos campos de la tabla; en el resto de los campos se insertará un valor NULL:

INSERT INTO Empleados (IdEmpleado, Nombre, Fecha_Alta) VALUES (858, 'Felipe Rodríguez Pérez', #04/08/04#)

Ejecutando la anterior consulta SQL, estaremos insertando en la tabla Empleados de la base de datos una nueva fila con la información correspondiente a los campos especificados. Si la información que se desea introducir es la correspondiente a la fila completa de la tabla, entonces podemos ignorar la lista de campos, como se puede ver en el siguiente ejemplo, el cual añadirá un nuevo registro a la tabla, especificando un valor para cada campo de la misma:

INSERT INTO Empleados VALUES (238, 'Juan Aguilar Ruiz', 23002, 'C:\. Al Andalus, 23', 'Jaén', #04/08/2004#)

Siempre y cuando los campos no sean requeridos, o no constituyan la clave principal de la tabla, si no deseamos especificar un valor para cada campo, deberemos de especificar explícitamente el valor NULL:

INSERT INTO Empleados VALUES (238, 'Juan Aguijar Ruiz', NULL, NULL, NULL, #04/08/2004#)

Consulta de inserción de múltiples registros

Si la consulta de datos añadidos afecta a múltiples registros, utilice la siguiente sintaxis:

INSERT INTO tabla_destino [IN base_datos_externa]
SELECT [origen.]campo1[, campo2[, ...]
FROM tabla_origen

Para ello necesitará utilizar una cláusula SELECT … FROM con la que especificará los campos de la tabla o de la consulta almacenada que se agregarán a la tabla de destino indicada.

Tanto la tabla de origen como de destino puede ser una tabla o una consulta que se encuentre almacenada en la base de datos. Si ha especificado una consulta, se anexará el conjunto de registros a todas y cada una de las tablas especificadas en la consulta.

El siguiente ejemplo insertará todos los registros de la tabla Clientes_Antiguos en la nueva tabla de Clientes:

INSERT INTO Clientes SELECT * FROM CIientes_Antiguos

Si en nuestra base de datos tenemos creada una consulta de selección llamada Consulta_Clientes, el siguiente ejemplo mostrará cómo añadir nuevos registros a las tablas que conforman dicha consulta:

INSERT INTO Consulta_Clientes SELECT * FROM Clientes_Antiguos

A continuación añadiremos los registros existentes en la tabla de un vendedor que cumplan con el criterio especificado, creando con aquellos nuevos registros en nuestra tabla de Pedidos:

INSERT INTO Pedidos
SELECT IdCliente, Fecha, IdProducto, IdVendedor
FROM Vendedor10
WHERE Fecha > = #04/06/2004#

Cuando necesite indicar una base de datos externa Microsoft Access, podrá utilizar cualquiera de las dos sintaxis que a continuación se indican, teniendo en cuenta que si la ruta la encierra entre comillas simples, no deberá de utilizar los corchetes. En cambio, si el par de comillas simples va inmediatamente después de la cláusula IN, sí deberá de encerrar entre corchetes la cadena de conexión, indicando el tipo de ISAM a utilizar (MS Access, en el supuesto que la base de datos externa sea Microsoft Access), y la ruta completa de la base de datos en el parámetro DATABASE, así como cualquier otro parámetro opcional que sea requerido, como bien pudiera ser la contraseña de la base de datos.

Si la base de datos externa es distinta de Microsoft Access, necesariamente deberá de utilizar el formato de corchetes para especificar todos los parámetros requeridos para conectarse con el origen de datos.

IN Ruta base datos externaIN C:\Mis documentos\Bd1.mdb
IN »[MS Access;DATABASE=Ruta base datos externa;PWD=contraseña]IN »[MS Access;DATABASE=C:\Mis documentos\Bd1.md;PWD=contraseña]

El siguiente ejemplo insertará en una tabla de una base de datos Microsoft Access, los registros existentes en un archivo de dBASE 5.0 que tiene la misma estructura que la tabla de Access:

INSERT INTO Clientes SELECT * FROM Clientes#dbf IN ''[dBASE 5.0;DATABASE=C:\Mis documentos\]

Por último, insertaremos en un archivo de texto los datos de una tabla de Access:

INSERT INTO Clientes#txt IN ''[TEXT;HDR=Yes;DATABASE=C:\Mis documentos\] SELECT * FROM Clientes

Consulta de actualización: la instrucción UPDATE

Mediante la instrucción UPDATE podemos crear una consulta de actualización para modificar el valor de los campos de una tabla según los criterios especificados en la consulta, siendo su sintaxis la siguiente:

UPDATE nombreTabla SET nombre_campo1 = nuevo_valor1 [, nombre_campo2 = nuevo_valor2] WHERE criterio

La ejecución de esta instrucción recorre todas las filas de la tabla indicada en nombreTabla, actualizando los campos con el nuevo_valor en aquellos registros que cumplan con la condición impuesta en la cláusula WHERE, por lo que se recomienda utilizar una consulta de actualización cuando desee modificar numerosos registros o cuando estos se encuentren en múltiples tablas.

Al igual que ocurre con la instrucción INSERT INTO, la instrucción UPDATE tampoco devuelve un conjunto de registros, por lo que necesitará utilizar los métodos comentados anteriormente en la consulta de datos anexados, para conocer el número de registros que se han sido afectados por la ejecución de la consulta de actualización.

El siguiente ejemplo actualizará en un 2 por 100 el valor del campo Sueldo de la tabla Empleados, para todos aquellos trabajadores que tengan un grado determinado:

UPDATE Empleados SET Sueldo = Sueldo * 1.02 WHERE Grado = 5

Tenga muy presente que si no especifica un criterio mediante la cláusula WHERE, la consulta de actualización afectará a todos los registros de la tabla:

UPDATE Empleados SET Sueldo = Sueldo * 1.02

A continuación actualizaremos el Grado y Sueldo personal de un empleado en concreto:

UPDATE Empleados SET Grado = 8, Sueldo = 986.05 WHERE IdEmpleado = 248

Consulta de eliminación: la instrucción DELETE

Hemos visto cómo añadir nuevos registros a una tabla y cómo modificar los valores de los campos utilizando las correspondientes instrucciones del Lenguaje de Manipulación de Datos de SQL; ya solo nos queda por conocer cómo eliminar los registros de una tabla.

Mediante la instrucción DELETE eliminaremos todos aquellos registros que cumplan con el criterio establecido en una cláusula WHERE, y que se encuentren incluidos en la tabla o tablas especificadas en la cláusula FROM. Su sintaxis es la siguiente:

DELETE [ tabla.*] FROM expresión_tabla WHERE criterios

Si desea eliminar todos los registros de la tabla, puede resultar que considere necesario el eliminar la propia tabla de la base de datos, mediante la instrucción DROP TABLE analizada en el apartado Eliminar una tabla del Capítulo II, ya que esta es más eficaz que ejecutar la consulta de eliminación. Pero debe de tener en cuenta que si elimina la tabla, perderá toda la estructura de la misma, cosa que no sucederá si ejecuta una instrucción DELETE, dado que solamente eliminará los registros existentes, conservando todas las restantes propiedades e índices de la tabla, así como de los campos existentes en la misma.

La instrucción DELETE resulta útil cuando deseamos eliminar un gran número de registros, acción esta que se llevará a cabo eliminando filas completas de la tabla. Si solo desea eliminar ciertos valores correspondientes a un campo, utilice una consulta de actualización para establecer a NULL el valor del campo, siempre que la columna permita la asignación de dicho valor.

Si la consulta de eliminación afecta solo a los registros de una tabla, no es necesario que indique el nombre de la tabla. Por el contrario, si afecta a múltiples tablas, necesariamente tendrá que indicar el nombre de las mismas.

Puede utilizar la instrucción DELETE para eliminar los registros de tablas que formen una relación de uno a varios, teniendo en cuenta que si en la relación ha especificado el valor Eliminar en cascada los registros relacionados, se eliminaran todos los registros correspondientes a la tabla del lado varios cuando se elimine el registro correspondiente del lado uno de la relación. Si por el contrario, la relación no permite la eliminación en cascada, no podrá eliminar los registros de la tabla del lado uno de la relación que tengan registros relacionados en la tabla del lado varios. Un ejemplo típico de eliminación en cascada sería aquella relación existente entre las tablas Clientes (lado uno) y Facturas (lado varios). La eliminación de un registro de la tabla Clientes hará que se eliminen también todos los registros relacionados en la tabla Facturas.

Al igual que el resto de las consultas de acción comentadas en este capítulo, la instrucción DELETE no devuelve ningún conjunto de registros que nos haga saber el número de registros que han sido afectados por la consulta de eliminación.

Por último, y dado que estamos hablando de ELIMINAR DATOS, es sumamente importante que conserve copias de seguridad de sus datos, debido a que no podrá deshacer la operación ejecutada mediante una consulta de eliminación.

El siguiente ejemplo eliminará de la tabla Empleados todos aquellos registros que tengan un Grado en concreto:

DELETE FROM Empleados WHERE Grado = 8

En el supuesto de que deseemos eliminar todos los registros de la tabla, no indique la cláusula WHERE:

DELETE FROM Empleados

A continuación eliminaremos de la tabla Facturas todos los registros que pertenezcan a un mismo cliente, por lo que al combinar dos tablas necesariamente tendrá que indicar el nombre de la tabla que contiene los registros que se van a eliminar:

DELETE Facturas.*
FROM Clientes INNER JOIN Facturas ON Clientes.IdCliente = Facturas.IdCliente
WHERE Clientes.IdCliente=258

Por último, el siguiente ejemplo eliminará un registro en las dos tablas especificadas, siempre y cuando la segunda tabla (que sería el lado varios de una relación uno a varios) no tenga más de un registro relacionado en la primera tabla (el lado uno):

DELETE Clientes.*, Facturas.*
FROM Clientes INNER JOIN Facturas ON Clientes.IdCliente = Facturas.IdCliente
WHERE Clientes.IdCliente=258

Comentar que si ejecuta esta última consulta desde la interfaz de usuario de Microsoft Access, no se eliminará ningún registro. En cambio, si utiliza la biblioteca de DAO o ADO, si hay un único registro que satisfaga el criterio especificado, se eliminará el registro tanto en la tabla Clientes como en la tabla Facturas.

Categorías: SQL

0 comentarios

Deja una respuesta

Marcador de posición del avatar

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *