Mysql
 sql >> Base de données >  >> RDS >> Mysql

MySQL Trigger pour empêcher INSERT sous certaines conditions

Exemple 1, MySQL, vous pouvez annuler cette insertion dans le déclencheur avec signal sqlstate

  1. Créez votre tableau avec une colonne varchar :

    mysql> create table yar (val VARCHAR(25) not null);
    Query OK, 0 rows affected (0.02 sec)
    
  2. Créez votre déclencheur "avant insertion" pour vérifier une condition et l'interdire.

    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. Essayez d'insérer où la condition est remplie :

    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)
    

Vous avez inséré une chaîne vide, la gâchette a vu qu'elle était vide et a déclenché le signal pour empêcher l'insertion.

Exemple 2, MySQL, Annuler l'insertion dans le déclencheur en faisant en sorte que les données violent une contrainte non nulle.

  1. Créez votre tableau avec une colonne varchar :

    mysql> create table yar (val VARCHAR(25) not null);
    Query OK, 0 rows affected (0.02 sec)
    
  2. Créez votre déclencheur "avant insertion" pour vérifier une condition et l'interdire.

    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. Essayez d'insérer où la condition est remplie :

    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)
    

Vous avez inséré une chaîne vide, le déclencheur a vu qu'elle était vide et a changé la valeur en null, donc l'insertion est empêchée.