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:
- it's
before
trigger because it's event in mysql in can alter values of columns of row being inserted. access values usingnew
keyword. - now when try insert row
proposta
checks if there 2 plays same theater play of you're trying insert violatesnot null
constraint onnomestagione
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
Post a Comment