mysql - MySQL断言

  显示原文与译文双语对照的内容
0 0

我是一个MySQL和SQL新手,我刚刚发现MySQL不支持断言。

我有那些表格:

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;

对于 mysql,我无法编写断言。 是否可以使用一个或者多个触发器模拟以下断言?

crate assertion RA2 check (
 not exists (
 select stagione.teatro, stagione.nome, stagione.biennio, count(*)
 from (stagione join proposta on 
 (stagione.nome = proposta.nomeStagione) and 
 (stagione.biennio = proposta.biennioStagione)) 
 join produzione on 
 (proposta.spettacolo = produzione.spettacolo) and
 (stagione.teatro = produzione.produttore)
 group by stagione.teatro, stagione.nome, stagione.biennio
 having count(*)> 2
 )
 ); 

我该如何写这个触发器?

时间:原作者:3个回答

0 0

如果我正确理解你的模式,那么你可以通过像这样的触发器来实施你的规则

CREATE TRIGGER tg_proposta_before_insert
BEFORE INSERT ON proposta
FOR EACH ROW
 SET NEW.nomeStagione = IF(
 (
 SELECT COUNT(*) total
 FROM proposta p JOIN produzione d
 ON p.spettacolo = d.spettacolo
 WHERE p.nomeStagione = NEW.nomeStagione
 AND p.biennioStagione = NEW.biennioStagione
 AND d.produttore = 
 (
 SELECT produttore
 FROM produzione
 WHERE spettacolo = NEW.spettacolo
 LIMIT 1
 )
 ) <2,
 NEW.nomeStagione,
 NULL
 );

为了使它工作 ,你必须对 proposta中的nomeStagione 列有 NOT NULL 约束。 因此,你最好对参与主键的所有列都具有这样的约束,不管它们是什么。

一些说明:

  1. 它是一个 BEFORE 触发器,因为它是MySql中唯一可以以改变插入行的值的事件。 使用 NEW 关键字访问这些值。
  2. 当你试图插入一行到 proposta 中时,它会检查是否有两个相同的戏剧播放,你正在试图插入的同一个剧院play有效阻止了这个插入操作。

这里有SQLFiddle demo演示。尝试取消注释最后一个插入语句和 Build Schema 你会看到它不会让你插入那一行。 这将是在本赛季的第三场比赛的第三。

原作者:
...