伙计们,我正在尝试为每个行循环内的每个行循环做一个,我真的是mysql的新手,这是我的第一个触发器,我有一个名为Disponivel的表,我想看看是否每个我试图在名为Venda的表上插入的行已经在Disponivel表中,如果是这种情况,我想将其插入到表Venda中。如果我要插入的行不是Disponivel表的一部分,则不应将其插入表Venda中。有人可以帮忙吗?这就是我所拥有的。
DELIMITER $$
create trigger venda_disponivel
before insert on Venda
for each row begin
for each row in Disponivel begin
if ((new.nomeA = Disponivel.nomeA) and (new.dia = Disponivel.dia) and (new.mes = Disponivel.mes) and (new.ano = Disponivel.ano) and (new.nomeR = Disponivel.nomeR)) then
end if;
end;
end$$
DELIMITER ;
这给了我这个错误:
错误1064(42000):您的SQL语法有错误;请检查与您的MySQL服务器版本相对应的手册以获取正确的语法,以在'如果在第4行((new.nomeA = Disponivel.nomeA)和(new.d')
create table Disponivel(
NomeA varchar(80),
NomeR varchar(80),
dia integer,
mes varchar(45),
ano integer,
primary key(nomeA, nomeR, dia, mes, ano),
foreign key(nomeA) references Prato(nomeA),
foreign key(nomeR) references Restaurante(nomeR),
foreign key(dia, mes, ano) references Data(dia, mes, ano));
create table Venda(
NomeA varchar(80),
dia integer,
mes varchar(45),
ano integer,
nomeR varchar(80),
num integer,
primary key(nomeA, nomeR, dia, mes, ano),
foreign key(nomeA) references Prato(nomeA),
foreign key(nomeR) references Restaurante(nomeR),
foreign key(dia, mes, ano) references Data(dia, mes, ano));
FOR EACH
在MySQL中不是循环结构。FOR EACH ROW
只是CREATE TRIGGER
语句的一部分而已,它仅表示以下事实:将为受触发器影响的每一行执行后面的代码。
现在可以通过额外的FK强制执行此约束,而无需触发
create table Venda(
NomeA varchar(80),
dia integer,
mes varchar(45),
ano integer,
nomeR varchar(80),
num integer,
primary key(nomeA, nomeR, dia, mes, ano)
,foreign key(nomeA) references Prato(nomeA)
,foreign key(nomeR) references Restaurante(nomeR)
,foreign key(dia, mes, ano) references Data(dia, mes, ano)
,foreign key(nomeA, nomeR, dia, mes, ano) references Disponivel(nomeA, nomeR, dia, mes, ano)
);
这是SQLFiddle演示。尝试取消注释最后插入的内容,然后单击Build Schema
。您会看到FK不允许插入此行。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句