尝试编写 MySQL 触发器以替换 phpmyadmin 上的 CHECK 约束时出现语法错误

Posted

技术标签:

【中文标题】尝试编写 MySQL 触发器以替换 phpmyadmin 上的 CHECK 约束时出现语法错误【英文标题】:Syntax errors when trying to write MySQL trigger to substitute CHECK constraint on phpmyadmin 【发布时间】:2019-08-30 05:30:17 【问题描述】:

我正在尝试制作一个充当 CHECK 约束的 mysql 触发器,因为我使用的 MySQL 版本不支持它。

基本上,我正在为图书馆做一个数据库,其中表 bookloan 是所有贷款的记录。

bookloan 有 4 栏: - borrowerNo: 借款人ID - copyNo: 租借书籍的ID - dateOut:这本书的租借日期 - dateDue: 图书到期日期,总是在 dateOut 之后 14 天

我正在尝试限制借款人不能同时租借超过 3 本书。这是我的触发器代码:

CREATE TRIGGER maxbooks 
BEFORE INSERT OR UPDATE
ON bookloan FOR EACH ROW
BEGIN
IF COUNT(SELECT * FROM bookloan WHERE borrowerNo = NEW.borrowerNo AND dateOut <= NEW.dateOut AND dateDue > NEW.dateOut) >= 3 THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Maximum number of book rentals has been reached';
END IF;
END;

这是我从 MySQL 收到的错误消息:

#1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册以获取正确的语法使用 'IF COUNT(SELECT * FROM bookloan WHERE borrowerNo = NEW.borrowerNo AND dateOut

我猜测错误来自 Count() 函数,但不知道如何格式化它以便获得我想要的信息。

谢谢!

【问题讨论】:

尝试使用count(*) 而不是依靠查询。 count 是一个夸张的函数,只能使用 SQL 语法。 【参考方案1】:

尝试使用count(*),而不是在返回的查询结果中使用它。如下所示:

CREATE TRIGGER maxbooks 
BEFORE INSERT OR UPDATE
ON bookloan FOR EACH ROW
BEGIN
IF (SELECT COUNT(*) FROM bookloan WHERE borrowerNo = NEW.borrowerNo AND dateOut <= 
NEW.dateOut AND dateDue > NEW.dateOut) >= 3 THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Maximum number of book rentals has been reached';
END IF;
END;

【讨论】:

不幸的是,我仍然收到该代码的语法错误,但感谢您的回答。 @acroteau 什么是新错误?此代码似乎正确,而您的原始代码不正确。 通过精确复制粘贴代码,我得到:#1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 2 行的“OR UPDATE ON bookloan FOR EACH BEGIN IF SELECT COUNT(*) FROM bookloan WHE”附近使用正确的语法

以上是关于尝试编写 MySQL 触发器以替换 phpmyadmin 上的 CHECK 约束时出现语法错误的主要内容,如果未能解决你的问题,请参考以下文章

如何编写 MySQL 触发器以将行插入另一个表?

在 MySQL 中创建触发器以记录数据库中的更改

MySQL 用通配符替换

如何使用触发器生成字段的值?

我在哪里写 MySQL 触发器

尝试解决 MYSQL 更新触发器的语法错误