尝试编写 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 约束时出现语法错误的主要内容,如果未能解决你的问题,请参考以下文章