Pregunta Ejecución condicional después de un desencadenador de eliminación en SQLite


Necesito preparar un disparador SQLite para la siguiente condición -

  1. Hay tres tablas: retail_store, wholesale_store y product
  2. Las tablas retail_store y wholesale_store tienen la columna product_id del producto de la tabla

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

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

Gracias por considerar esto. ¡Aclamaciones!


5
2018-05-24 16:17


origen


Respuestas:


Tal vez el siguiente estado de SQL es útil para usted, pero no puedo asegurar que la sintaxis sea 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 ;

9
2018-05-24 16:49



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

Las acciones ON DELETE y ON UPDATE asociadas con cada clave foránea en   una base de datos SQLite es una de "NO ACTION", "RESTRICT", "SET NULL", "SET   DEFAULT "o" CASCADE ". Si una acción no se especifica explícitamente,   predeterminado a "NO ACTION".

NO HAY ACCIÓN: la configuración de "NO HACER" significa solo eso: cuando una clave principal   se modifica o elimina de la base de datos, no se toman medidas especiales.

RESTRICT: la acción "RESTRICT" significa que la aplicación es   prohibido borrar (para ON BORRAR RESTRINGIR) o modificar (para ON   ACTUALIZAR RESTRINGIR) una clave principal cuando existe una o más claves secundarias   mapeado a eso. La diferencia entre el efecto de una acción RESTRINGIDA   y la aplicación normal de restricción de clave foránea es que el RESTRICTO   el procesamiento de acción ocurre tan pronto como el campo se actualiza, no en el   fin de la declaración actual como lo haría con una restricción inmediata,   o al final de la transacción actual como lo haría con un diferido   restricción. Incluso si la restricción de clave externa a la que está asociada es   diferida, la configuración de una acción RESTRINGIDO hace que SQLite devuelva un   error inmediatamente si se elimina una clave principal con claves secundarias dependientes   o modificado.

SET NULL: si la acción configurada es "SET NULL", cuando un padre   la clave se elimina (para ON DELETE SET NULL) o se modifica (para ON UPDATE SET   NULL), las columnas de clave secundaria de todas las filas en la tabla secundaria que   mapeado a la clave principal están configurados para contener valores SQL NULL.

SET DEFAULT: Las acciones "SET DEFAULT" son similares a "SET NULL",   excepto que cada una de las columnas de clave secundaria está configurada para contener el   valor predeterminado de columnas en lugar de NULL. Consulte CREAR TABLA   documentación para detalles sobre cómo se asignan los valores predeterminados a la tabla   columnas

CASCADE: una acción "CASCADE" propaga la operación de eliminación o actualización   en la clave principal para cada clave secundaria dependiente. Para un "ON DELETE"   CASCADE "acción, esto significa que cada fila en la tabla secundaria que era   asociado con la fila principal eliminada también se elimina. Para un "ON   Acción ACTUALIZACIÓN CASCADE ", significa que los valores almacenados en cada   la clave secundaria dependiente se modifica para coincidir con los nuevos valores clave principales.

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


1
2018-05-24 16:21



Hola leyendo la documentación Sqllite Foreing Key usa ese comando SQL:

PRAGMA foreign_keys = ON;

-1
2018-02-20 21:21