sql >> Base de Datos >  >> RDS >> Mysql

MySQL Trigger para evitar INSERTAR bajo ciertas condiciones

Ejemplo 1, MySQL, puede cancelar esa inserción en el disparador con signal sqlstate

  1. Crea tu tabla con una columna varchar:

    mysql> create table yar (val VARCHAR(25) not null);
    Query OK, 0 rows affected (0.02 sec)
    
  2. Cree su disparador 'antes de insertar' para verificar una condición y rechazarla.

    mysql> delimiter $$
    mysql> create trigger foo before insert on yar
        -> for each row
        -> begin
        -> if new.val = '' then
        -> signal sqlstate '45000';
        -> end if;
        -> end;$$
    Query OK, 0 rows affected (0.01 sec)
    
  3. Intente insertar donde se cumple la condición:

    mysql> delimiter ;
    
    mysql> insert into yar values("");
    ERROR 1644 (45000): Unhandled user-defined exception condition
    
    mysql> insert into yar values ("abc");
    Query OK, 1 row affected (0.01 sec)
    
    mysql> select * from yar;
    +-----+
    | val |
    +-----+
    | abc |
    +-----+
    1 row in set (0.00 sec)
    

Insertaste una cuerda en blanco, el gatillo vio que estaba en blanco y elevó la señal para evitar la inserción.

Ejemplo 2, MySQL, cancela la inserción en el disparador haciendo que los datos violen una restricción no nula.

  1. Crea tu tabla con una columna varchar:

    mysql> create table yar (val VARCHAR(25) not null);
    Query OK, 0 rows affected (0.02 sec)
    
  2. Cree su disparador 'antes de insertar' para verificar una condición y rechazarla.

    mysql> delimiter $$
    mysql> create trigger foo before insert on yar
        -> for each row
        -> begin
        -> if new.val = '' then
        -> set new.val = NULL;
        -> end if;
        -> end;$$
    Query OK, 0 rows affected (0.01 sec)
    
  3. Intente insertar donde se cumple la condición:

    mysql> delimiter ;
    
    mysql> insert into yar values("");
    ERROR 1048 (23000): Column 'val' cannot be null
    
    mysql> insert into yar values ("abc");
    Query OK, 1 row affected (0.01 sec)
    
    mysql> select * from yar;
    +-----+
    | val |
    +-----+
    | abc |
    +-----+
    1 row in set (0.00 sec)
    

Insertó una cadena en blanco, el gatillo vio que estaba en blanco y cambió el valor a nulo, por lo que se evita la inserción.