Cómo utilizar actualizar, suprimir e insertar sentencias SQL

Además de SELECT declaraciones, ACTUALIZACIÓN, BORRAR, y INSERT Sentencias SQL también pueden incluir DÓNDE cláusulas. Aquellas DÓNDE cláusulas pueden contener subconsultas de la misma manera que SELECT declaraciones 'DÓNDE cláusulas hacen.

Por ejemplo, Zetec acaba de hacer un acuerdo de compra con el volumen de ventas Olímpicos y quiere ofrecer olímpico con un crédito retroactivo del 10 por ciento de todas sus compras en el último mes. Usted puede dar a este crédito con un ACTUALIZACIÓN declaración:

ACTUALIZACIÓN TRANSMASTERSET NetAmount = NetAmount * 0.9WHERE Fecha de Venta> (CurrentDate - 30) DÍA Y CustID = (SELECT CustIDFROM CUSTOMERWHERE Empresa = 'Ventas Olímpico') -

Usted también puede tener una subconsulta correlacionada en un ACTUALIZACIÓN comunicado. Supongamos que la tabla CLIENTE tiene una columna LastMonthsMax, y Zetec quiere dar un crédito de este tipo para las compras que superen LastMonthsMax para el cliente:

ACTUALIZACIÓN Transmaster TMSET NetAmount = NetAmount * 0.9WHERE NetAmount> (SELECCIONAR AL CLIENTE LastMonthsMaxFROM CWHERE C.CustID = TM.CustID) -

Tenga en cuenta que esta subconsulta se correlaciona: La DÓNDE cláusula en las últimas referencias de línea tanto en el CustID de la fila CLIENTE de la subconsulta y el CustID de la fila Transmaster corriente que es un candidato para la actualización.

Una subconsulta en un ACTUALIZACIÓN declaración también puede hacer referencia a la tabla que se está actualizando. Supongamos que Zetec quiere dar un crédito de 10 por ciento a los clientes cuyas compras han superado los $ 10.000:

ACTUALIZACIÓN Transmaster TM1SET NetAmount = NetAmount * 0.9WHERE 10000 lt; (SELECT SUM (NetAmount) DE Transmaster TM2WHERE TM1.CustID = TM2.CustID) -

La subconsulta calcula el interior SUM de El Importe neto columna para todas las filas Transmaster para el mismo cliente. ¿Qué significa esto? Supongamos que el cliente CustID = 37 tiene cuatro filas en Transmaster con valores para Importe neto: 3000, 5000, 2000, y 1000. los SUM de Importe neto para esto CustID es 11000.

El orden en el que el ACTUALIZACIÓN declaración procesa las filas se define por su aplicación y por lo general no es predecible. El orden puede variar dependiendo de cómo las filas están dispuestas en el disco. Suponga que la aplicación procesa las filas de este CustID en este orden: primero el Transmaster con una Importe neto de 3000, a continuación, el que tiene Importe neto= 5000, etcétera.

Después de las tres primeras filas de CustID 37 se han actualizado, su Importe neto valores son 2700 (90 por ciento de los $ 3.000), 4500 (90 por ciento de los $ 5.000), y 1800 (90 por ciento de $ 2,000). Entonces, al procesar la última fila para Transmaster CustID 37 (cuyo Importe neto es 1000), el SUM devuelto por la subconsulta sería parecer ser 10000, y la vieja Importe neto valor de la última fila de CustID 37.

Por lo tanto, parece que la última fila de CustID 37 no se actualiza, porque la comparación con ese SUM No es verdad - después de todo, 10000 no es menor de 10000. Pero no es así como la ACTUALIZACIÓN declaración se define cuando una subconsulta hace referencia a la tabla que se está actualizando.

Todas evaluaciones de subconsultas en un ACTUALIZACIÓN Declaración de Referencia los viejos valores de la mesa- los que se van a actualizar. En el precedente ACTUALIZACIÓN para CustID 37, retorna la subconsulta 11000 - el original SUM.

La subconsulta en un DÓNDE cláusula opera lo mismo que un SELECT declaración o un ACTUALIZACIÓN comunicado. Lo mismo es cierto para BORRAR y INSERT. Para eliminar todas las transacciones de Olímpicos, utilice esta declaración:

DELETE FROM TRANSMASTERWHERE CustID = (SELECT CustIDFROM CUSTOMERWHERE Empresa = 'Ventas Olímpico') -

Al igual que con ACTUALIZACIÓN, BORRAR subconsultas también se pueden correlacionar y también pueden hacer referencia a la tabla que se borre. Las reglas son similares a las reglas para ACTUALIZACIÓN subconsultas. Suponga que desea eliminar todas las filas de Transmaster para clientes cuyo total de Importe neto es mayor que $ 10.000:

DELETE FROM Transmaster TM1WHERE 10000 lt; (SELECT SUM (NetAmount) DE Transmaster TM2WHERE TM1.CustID = TM2.CustID) -

Esta consulta elimina todas las filas de Transmaster que tienen CustID 37, así como cualquier otro cliente con las compras superiores a $ 10.000. Todas las referencias a Transmaster en la subconsulta denotan el contenido de Transmaster antes de cualquier eliminaciones por la sentencia actual. Así que incluso cuando se está borrando la última fila para Transmaster CustID 37, la subconsulta se evalúa sobre la mesa y vuelve Transmaster originales 11000.

Al actualizar, eliminar o insertar registros de base de datos, se arriesga a hacer que los datos de una tabla incompatible con otras tablas de la base de datos. Tal inconsistencia se llama anomal modificacióny. Si elimina registros Transmaster y una mesa TRANSDETAIL depende Transmaster, debe eliminar los registros correspondientes de TRANSDETAIL, también.

Esta operación se llama eliminación en cascada, debido a que la eliminación de un registro padre debe conectar en cascada a sus registros secundarios asociados. De lo contrario los registros secundarios no eliminados se convierten en huérfanos. En este caso, serían las líneas de detalle de factura que se encuentran en el limbo porque ya no están conectados a un registro de la factura.

Si su implementación de SQL no soporta eliminaciones en cascada, debe hacer las eliminaciones a ti mismo. En este caso, elimine los registros apropiados de la tabla secundaria antes de eliminar el registro correspondiente de la matriz. De esa manera, usted no tiene registros huérfanos en la tabla secundaria, aunque sea por un segundo.




» » » » Cómo utilizar actualizar, suprimir e insertar sentencias SQL