我一直试图创建一个Trigger,但是我的尝试都没有成功。我似乎得到了一个错误(#1064),我没有解决方案。有人可以解释或演示语法中的任何错误。
我指出:
我将delivery_id作为交付表中的主键, 我还在entry_log表中将delivery_id作为外键。 通过比较两个id(如果为真),将返回一个引用该位输出的文本(0或1)
DELIMITER //
DROP TRIGGER IF EXISTS entry_trigger//
CREATE TRIGGER entry_trigger BEFORE INSERT ON entry_log
FOR EACH ROW
BEGIN
DECLARE @xentry VARCHAR(45)
DECLARE @inta bit
SET @inta = SELECT allowed
FROM delivery
WHERE delivery.delivery_id = entry_log.delivery_id;
CASE
when @inta = 0 then @xentry = 'Acces Denied'
when @inta = 1 then @xentry = 'Acces Allowed'
END CASE
INSERT INTO entry_log(entry_time,access_allowed) VALUES(now(),@xentry);
END
//
答案 0 :(得分:1)
这假设您使用MySQL。在触发器的主体中使用
WHERE delivery.delivery_id = entry_log.delivery_id;
我想你想要与运行触发器的entry_log条目进行比较,对吗?在这种情况下,您必须使用以下语法:
WHERE delivery.delivery_id = NEW.delivery_id;
有关更多示例,请参阅here。
<强>更新强>
我也看到你试图在TRIGGER中做INSERT INTO entry_log
。这当然行不通,因为你会创建一个无限的递归循环。内
触发器的主体可以执行不相关的表访问,但不能进入要插入的表。您可以通过设置NEW.xyz = whatever
更新2
我怀疑,你的CASE
陈述是正确的。至少它必须以END CASE
结尾。您可以在此处使用IF
,因为您没有很多案例需要解决。如果您必须使用CASE
,这篇文章可能会对您有所帮助:MYSQL Trigger set datetime value using case statement
更新3 我不确定,但我认为你需要围绕变量设置语句括号。尝试这个触发器定义:
DELIMITER //
DROP TRIGGER IF EXISTS entry_trigger//
CREATE TRIGGER entry_trigger BEFORE INSERT ON entry_log
FOR EACH ROW
BEGIN
SET @inta = (SELECT allowed
FROM delivery
WHERE delivery.delivery_id = NEW.delivery_id);
SET NEW.access_allowed = @inta;
SET NEW.entry_time = NOW();
END
//
请注意,这是我脑子里写的,所以要注意我脚本中的语法错误。