sql - MySQL assertion -


i'm mysql , sql newbie, discovered mysql doesn't support assertions.

i've tables:

 create table stagione   (     nome           varchar(20),      biennio        char(9),      teatro         varchar(20),     primary key(nome, biennio),     foreign key (teatro) references teatro(nome)  on update cascade on delete set null   )   engine=innodb; 
 create table produzione   (     produttore     varchar(20),      spettacolo     varchar(40),     primary key(produttore, spettacolo),     foreign key (produttore) references produttore(nome)                 on update cascade on delete cascade,     foreign key (spettacolo) references spettacolo(titolo)                 on update cascade on delete cascade
) engine=innodb;
 create table proposta   (    nomestagione varchar(20),    bienniostagione char(9),    spettacolo varchar(40),    primary key(nomestagione, bienniostagione, spettacolo),    foreign key (nomestagione, bienniostagione) references stagione(nome, biennio) on update cascade on delete cascade,    foreign key (spettacolo) references spettacolo(titolo)  on update cascade on delete cascade   ) engine=innodb; 

with mysql have no way of writing assertions. possible simulate following assertion using 1 or more triggers ?

 crate assertion ra2 check (     not exists (       select stagione.teatro, stagione.nome, stagione.biennio, count(*)       (stagione join proposta on             (stagione.nome = proposta.nomestagione) ,             (stagione.biennio = proposta.bienniostagione))             join produzione on             (proposta.spettacolo = produzione.spettacolo) ,            (stagione.teatro = produzione.produttore)       group stagione.teatro, stagione.nome, stagione.biennio       having count(*) > 2     )   );           

how should write trigger?

if understand correctly schema can enforce rule trigger this

create trigger tg_proposta_before_insert before insert on proposta each row   set new.nomestagione = if(     (       select count(*) total         proposta p join produzione d           on p.spettacolo = d.spettacolo        p.nomestagione = new.nomestagione          , p.bienniostagione = new.bienniostagione          , d.produttore =               (                select produttore                  produzione                 spettacolo = new.spettacolo                 limit 1              )     ) < 2,     new.nomestagione,     null   ); 

in order work you have have not null constraint on nomestagione column in proposta table. you better have such constraints on columns participate in primary keys anyway

some explanation:

  1. it's before trigger because it's event in mysql in can alter values of columns of row being inserted. access values using new keyword.
  2. now when try insert row proposta checks if there 2 plays same theater play of you're trying insert violates not null constraint on nomestagione column (it can other column) preventing insert being completed.

here sqlfiddle demo. try uncomment last insert statement , build schema. you'll see won't let insert row. would've been third play theater in season.


Comments

Popular posts from this blog

javascript - DIV "hiding" when changing dropdown value -

node.js - Node - Passport Auth - Authed Post Route hangs on form submission -

Does Firefox offer AppleScript support to get URL of windows? -