mysql - #1064 - 在声明附近创建触发器时出现 MySQL 错误

标签 mysql sql database triggers declare

在创建触发器时,MySQL 向我报告了此错误:

#1064 - You have an error in your SQL syntax; check the manual that corresponds
 to your MariaDB server version for the right syntax to use near 
'DECLARE cadhoc_total INT(1) UNSIGNED;
SET cadhoc_total = NEW.cadhoc_assigned + ' at line 2

这是代码:

DELIMITER $$
DROP TRIGGER IF EXISTS inviter_cadhoc $$
CREATE TRIGGER inviter_cadhoc BEFORE UPDATE ON inviter FOR EACH ROW
DECLARE cadhoc_total INT(1) UNSIGNED;
SET cadhoc_total = NEW.cadhoc_assigned + NEW.cadhoc_withdrew;
IF cadhoc_total > 5 THEN
    SIGNAL SQLSTATE '45000' SET message_text = 'Bad update on inviter table: cadhoc must be 5 at maximum';
END IF;
IF NEW.cadhoc_withdrew < OLD.cadhoc_withdrew
    SIGNAL SQLSTATE '45000' SET message_text = 'Bad update on inviter table: cannot restore withdrew cadhoc';
END IF;
IF NEW.cadhoc_assigned > OLD.cadhoc_assigned
    SIGNAL SQLSTATE '45000' SET message_text = 'Bad update on inviter table: cannot restore assigned cadhoc';
END IF;
$$
DELIMITER ;

感兴趣的表格如下,其中有两个非常重要的字段:cadhoc_withdrewcadhoc_assigned:它们的总和绝不能> 5。

CREATE TABLE IF NOT EXISTS Inviter (
    nome VARCHAR(10) NOT NULL,
    cognome VARCHAR(20) NOT NULL,
    email VARCHAR(35) NOT NULL,
    #normalizzare
    cadhoc_assigned INT(1) NOT NULL DEFAULT 5,
    cadhoc_withdrew INT(1) NOT NULL DEFAULT 0,
    data_nascita DATE NOT NULL,
    PRIMARY KEY (email)
) Engine=InnoDB;

最佳答案

将缺少的 THEN 添加到 IF 子句,并用 BEGIN/END block 包装所有内容:

CREATE TRIGGER inviter_cadhoc BEFORE UPDATE ON inviter 
FOR EACH ROW
BEGIN
DECLARE cadhoc_total INT(1) UNSIGNED;
SET cadhoc_total = NEW.cadhoc_assigned + NEW.cadhoc_withdrew;
IF cadhoc_total > 5 THEN
    SIGNAL SQLSTATE '45000' SET message_text = 'Bad update on inviter table: cadhoc must be 5 at maximum';
END IF;
IF NEW.cadhoc_withdrew < OLD.cadhoc_withdrew THEN
    SIGNAL SQLSTATE '45000' SET message_text = 'Bad update on inviter table: cannot restore withdrew cadhoc';
END IF;
IF NEW.cadhoc_assigned > OLD.cadhoc_assigned THEN
    SIGNAL SQLSTATE '45000' SET message_text = 'Bad update on inviter table: cannot restore assigned cadhoc';
END IF;
END

SqlFiddleDemo

关于mysql - #1064 - 在声明附近创建触发器时出现 MySQL 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33921273/

相关文章:

mysql - 在 symfony2 中使用控制台时如何选择与数据库的连接

php - MYSQL 显示错误::每个派生表都必须有自己的别名 om PHP MYSQL

php - 从具有相同列的两个表输出数据并添加变量作为标识符

java - 使用 jdbc 的 SQL 语法错误

database - "select for update"什么时候加锁和解锁?

MySQL历史数据查找

mysql像oracle中的group by一样如何

php - 使用 PHP 进行 MySql 查询的最佳实践

sql - 错误 : invalid reference to FROM-clause entry for table "r"

sql - 选择日期范围之间的计数