Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
关于从MySQL触发器中删除别名的帮助_Mysql_Sql_Triggers - Fatal编程技术网

关于从MySQL触发器中删除别名的帮助

关于从MySQL触发器中删除别名的帮助,mysql,sql,triggers,Mysql,Sql,Triggers,我的问题太简单了(我猜),下面是一个触发器的例子,我正试图删除别名。我不知道我做错了什么,我就是做不好 DELIMITER @ CREATE TRIGGER StartOfShift BEFORE INSERT ON shift FOR EACH ROW BEGIN IF(NEW.CashierCode NOT IN ( SELECT w.EmployeeID FROM WorksOn as w JOIN shop AS s ON w.ShopID = s.ShopID JOIN CashMac

我的问题太简单了(我猜),下面是一个触发器的例子,我正试图删除别名。我不知道我做错了什么,我就是做不好

DELIMITER @
CREATE TRIGGER StartOfShift BEFORE INSERT ON shift
FOR EACH ROW
BEGIN
IF(NEW.CashierCode NOT IN ( SELECT w.EmployeeID FROM WorksOn as w
JOIN shop AS s ON w.ShopID = s.ShopID
JOIN CashMachineCode AS c ON s.ShopID = c.ShopID
WHERE c.CashMachineCode = NEW.CashMachineCode ))
THEN SET NEW.CashierCode = NULL;
END IF;
END;

以下应该是您正在寻找的内容:

DELIMITER @
CREATE TRIGGER StartOfShift BEFORE INSERT ON shift
FOR EACH ROW
BEGIN
    IF(NEW.CashierCode NOT IN ( 
        SELECT WorksOn.EmployeeID FROM WorksOn
            JOIN shop ON WorksOn.ShopID = shop.ShopID
            JOIN CashMachineCode ON shop.ShopID = CashMachineCode.ShopID
            WHERE CashMachineCode.CashMachineCode = NEW.CashMachineCode )
    ) THEN 
        SET NEW.CashierCode = NULL;
    END IF;
END@
DELIMITER ;

为什么需要删除别名?这应该很简单,只要在你看到别名的任何地方使用完整的表名。我想我会赢得StackOverflow上最愚蠢的问题徽章。别担心,我在这方面见过更糟糕的问题。我已经给出了答案,但也许你的努力失败了,因为你的触发器末尾的分隔符与开始时设置的分隔符不匹配?谢谢你的回答。它起作用了。是的,分隔符是错误的,但这是为什么?系统会让我在3分钟内接受你的答案mins@Sampas如果您没有为触发器定义设置不同的分隔符,MySQL就不知道触发器的结束位置,因此它希望在您上次(没有正确分隔)后再设置一个
END
END
@cypher:谢谢,我也正准备这么说@Sampas:我在末尾添加了一行,以显示正在重置的分隔符;在触发结束后,希望这有助于澄清一些我看到的事情。So
END@DELIMITER是此项的正确结尾。谢谢again@Sampas:“DELIMITER;”结尾只是重置分隔符。如果省略它,那么将来的查询将期望使用@作为分隔符