它给出了错误。我不明白为什么。
CREATE TRIGGER `estatecat_piece` AFTER INSERT ON `estate`
FOR EACH ROW
BEGIN
UPDATE estate_category set piece = (Select count(*) from estate where estate.estatecat_id=new.estatecat_id);
ERROR 1064 (42000):您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的 '' 附近使用正确的语法
-编辑-
阿吉安错误...
mysql> DELIMITER ; CREATE TRIGGER `estatecat_piece` AFTER INSERT ON `estate` FOR EACH ROW BEGIN UPDATE estate_category set piece = (Select count(*) from estate where estate.estatecat_id=new.estatecat_id); END; DELIMITER ;
mysql>
mysql> show triggers;
Empty set (0,00 sec)
_ 最后一次尝试的错误 _
mysql> DELIMETER $$ -> CREATE TRIGGER estatecat_piece
-> AFTER INSERT ON estate FOR EACH ROW
-> BEGIN
-> UPDATE estate_category set piece = (Select count(*) from estate where estate.estatecat_id=new.estatecat_id) where estatecat_id=new.estatecat_id;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DELIMETER $$
CREATE TRIGGER estatecat_piece
AFTER INSERT ON estate FOR EACH ROW ' at line 1
您的第一条语句的直接问题是它的 BEGIN 没有相应的 END。在这种情况下,END 应该在 CREATE TRIGGER 语句的最后。
一旦添加了 END 关键字,该语句在技术上就会变得正确,但在 MySQL 中执行它会遇到问题。原因是分号虽然是 SQL 中的标准语句分隔符,但 MySQL 也以特殊方式处理分号。MySQL 以分号分割输入文本,并将文本的每一部分分别发送到服务器。服务器因此接收到不完整的、语法不正确的片段并返回错误。有关更多详细信息,请参见此处:
因此,为了防止 MySQL 这样做,您需要指示它使用不同的符号作为分隔符——这就是DELIMITER命令的用途。因此,您的第二次尝试应该是这样的:
第一个 DELIMITER 命令告诉 MySQL 解析输入文本,直到
$$
从那时起遇到。因此,您的 CREATE TRIGGER 应该以$$
符号结尾,以便 MySQL 可以完整地使用它并将整个语句发送到服务器。最后,第二个 DELIMITER 命令恢复 MySQL 的标准分隔符以恢复命令的正常处理。还有一个更简单的解决方案,但它仅适用于与您的情况类似的情况。您的案例中的触发器主体由一条语句组成。这允许您在语句中省略关键字 BEGIN 和 END,因此完全避免使用 DELIMITER 命令:
上述触发器的工作原理完全相同。
另一方面,您的 UPDATE 语句可能有一个缺陷:正如目前所写的那样,它将更新每一行
piece
中具有相同行数的列- 与插入行匹配的类别的行数。如果表有多行,每行用于不同的类别,您可能需要在UPDATE 语句中引入一个过滤器,类似于子查询中的过滤器,以便仅更新相应的值:new.estatecat_id
piece