2012-05-24 10 views
5

necesito para preparar un disparador SQLite para el siguiente condición -ejecución condicional después de un desencadenador de eliminación en SQLite

  1. Hay tres mesas - retail_store, wholesale_store y producto
  2. Tablas retail_store y wholesale_store tener product_id columna de la tabla producto

Ahora quiero escribir un desencadenador de eliminación de tal manera que si se elimina un producto de retail_store y si no está en la tabla wholesale_store, ese registro del producto debe eliminarse de la tabla del producto.

** Entiendo como práctica, puede no ser una buena idea eliminar un registro de producto como este. Por favor, tome esta pregunta solo como una complicación técnica.

Gracias por considerar este. ¡Aclamaciones!

Respuesta

8

Tal vez la siguiente statemen SQL es útil para usted, pero no puede asegurar la sintaxis es correcta.

CREATE TRIGGER after_retail_store_delete after delete ON retail_store 
    WHEN ((select count() from wholesale_store where productid = OLD.id) = 0) 
    BEGIN 
     DELETE FROM product WHERE productid = OLD.id ; 
    END ; 
+0

IMPRESIONANTE wenhm !!! Funciona perfecto. Acabo de modificar la consulta de eliminación ya que el nombre de la tabla debe ser producto. No puedo creer por qué tu reputación aparece como solo '1' al responder esta pregunta. –

1

Parece que en realidad no necesita un activador. Consideraría hacer uso de la eliminación en cascada. ¿Estás usando claves extranjeras? Mira esto:

El ON DELETE y la acción ON UPDATE asociado con cada clave externa en una base de datos SQLite es una de "no acción", "Prohibir", "SET NULL", "SET DEFAULT" o "CASCADA". Si una acción no se especifica explícitamente, se establece de manera predeterminada en "NO ACTION".

NO ACCIÓN: Configurar "NO ACTION" significa exactamente eso: cuando se modifica o elimina una clave principal de la base de datos, no se toman medidas especiales.

restrinjan: La acción "Prohibir" significa que la aplicación es prohibido suprimir (por ON DELETE RESTRINJA) o modificar (por EN ACTUALIZACIÓN RESTRINJA) una clave principal cuando existe una o más claves secundarias ha correlacionado . La diferencia entre el efecto de una acción RESTRINJA y cumplimiento restricción de clave externa normal es que el procesamiento de la acción RESTRINJA sucede tan pronto como el campo se actualiza - no al final del estado de cuenta actual como lo haría con una restricción inmediata, o al final de la transacción actual como lo haría con una restricción diferida . Incluso si la restricción de clave externa a la que está asociada es diferida, la configuración de una acción RESTRICT hace que SQLite devuelva un error inmediatamente si se elimina una clave principal con claves secundarias dependientes o se modifica.

SET NULL: Si la acción configurada es "NULO", y luego, cuando se elimina una clave principal (para ON DELETE SET NULL) o modificado (por ON UPDATE SET NULL), las columnas de clave niños de todas las filas en la tabla secundaria que asignada a la clave primaria están configuradas para contener valores SQL NULL.

SET DEFAULT: Las acciones "SET DEFAULT" son similares a "conjunto vacío", excepto que cada una de las columnas de clave está puesto para contener el valor predeterminado columnas en lugar de NULL. Consulte la documentación de CREATE TABLE para obtener detalles sobre cómo se asignan los valores predeterminados a las columnas de la tabla .

CASCADE: Una acción "CASCADE" propaga la operación de eliminación o actualización en la clave padre de cada clave secundaria dependiente. Para una acción "ON DELETE CASCADE", esto significa que cada fila en la tabla secundaria que era asociada con la fila primaria eliminada también se elimina. Para una acción "ON UPDATE CASCADE", significa que los valores almacenados en cada clave secundaria dependiente se modifican para que coincidan con los nuevos valores clave principales.

Lee más aquí: http://www.sqlite.org/foreignkeys.html#fk_actions

+0

Gracias Jason. Hay un problema sin embargo. Como especifiqué, el producto solo debe eliminarse del producto de la mesa SÓLO SI el registro del producto no existe en la tabla wholesale_store. También es importante entender que esta operación es como si eliminara un registro secundario, luego elimine el registro principal también, si el registro secundario no existe en ninguna otra tabla. –

-1

Hola documentación lectura Sqllite Foreing Key uso que de comandos SQL:

PRAGMA foreign_keys = ON; 
Cuestiones relacionadas