我是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
)
);
我应该怎么写那个触发器?
答案 0 :(得分:3)
如果我理解了您的架构,那么您可以通过像这样的触发器强制执行您的规则
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
);
为了使其工作,您必须在NOT NULL
表的nomeStagione
列上设置proposta
约束。 最好还是对所有参与主键的列都有这样的约束
一些解释:
BEFORE
触发器,因为它是MySql中唯一可以更改正在插入的行的列值的事件。您可以使用NEW
关键字访问这些值。proposta
中插入一行时,它会检查您尝试插入的同一剧场游戏是否已经有两个游戏违反NOT NULL
约束nomeStagione
列(它可以是任何其他列)有效地防止此插入完成。这是 SQLFiddle 演示。 尝试取消注释最后一个插入语句和Build Schema
。你会看到它不会让你插入那一行。在本赛季,这将成为该剧院的第三场比赛。