首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL触发器:如何在不满足条件时抛出错误

MySQL触发器:如何在不满足条件时抛出错误
EN

Stack Overflow用户
提问于 2022-03-22 16:09:45
回答 1查看 442关注 0票数 0

DB模式:

代码语言:javascript
复制
book(bno,title, author,year,press,price,total,stock)

borrow(cno,bno,borrow_data,return_date)

书表中的样本数据:

1数据库系统概念-亚伯拉罕2011年McGrawHill 99.005 4

2现代操作系统Andrew 2011 Pearson 75.00 3 1

4计算机网络Tanenbaum 2000 Pearson 58.00 4 3\

借阅表中的样本数据:

1 2018-01 2018-01 2018-01

2018-01-06 2018-01-10

2 2018-02-03 2018-02-08

4 2018-02-05 2018-03-01

创建表的SQL:

代码语言:javascript
复制
CREATE TABLE book (bno INT NOT NULL AUTO_INCREMENT,
                   title VARCHAR(100),
                   author VARCHAR(40),
                   year YEAR,
                   press VARCHAR(60),
                   price DECIMAL(6,2),
                   total INT CHECK ((total >= 0)),
                   stock INT CHECK ((stock >= 0)),
                   PRIMARY KEY (bno));

CREATE TABLE borrow (cno INT,
                     bno INT,
                     borrow_date DATE,
                     return_date DATE,
                     CHECK (borrow_date < return_date));

INSERT INTO book
VALUES (1,'Database System Concepts','Abraham',2011,'McGrawHill',99.00,5,4),
       (2,'Modern Operating Systems','Andrew',2009,'Pearson',75.00,3,1),
       (3,'Computer Network','Tanenbaum',2000,'Pearson',58.00,4,3);
   
INSERT INTO borrow
VALUES (1,1,'2018-1-1','2018-1-14'),
       (1,2,'2018-1-6','2018-1-10'),
       (2,2,'2018-2-3','2018-2-8'),
       (3,3,'2018-2-5','2018-3-1'); 

要求:

当插入新记录以借入表时,检查bno是否存在于图书中,如果库存大于0,则按stock-1更新图书表中的库存,并完成插入操作;否则抛出错误。

我不知道为什么它不适用于我的代码。任何帮助都将不胜感激!!

代码语言:javascript
复制
CREATE TRIGGER borrow_insert_trigger
BEFORE INSERT ON borrow
FOR EACH ROW
BEGIN
  IF EXISTS (SELECT bno 
             FROM book
             WHERE NEW.bno = book.bno) 
  AND (SELECT stock
       FROM book
       WHERE NEW.bno = book.bno)>0
  THEN UPDATE book
       SET stock = stock-1
       WHERE NEW.bno = book.bno
  ELSE SIGNAL SQLSTATE '45000'
       SET MESSAGE_TEXT = 'Book doesn\'t exist or out of stock'
  END IF
END;

The error:
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 'ELSE SIGNAL SQLSTATE '45000'
   SET MESSAGE_TEXT = 'Book doesn\'t exist or o' at line 14
EN

回答 1

Stack Overflow用户

发布于 2022-03-23 03:29:16

必须使用分号(;)来终止触发器正文中的每个语句。

代码语言:javascript
复制
CREATE TRIGGER borrow_insert_trigger
BEFORE INSERT ON borrow
FOR EACH ROW
BEGIN
  IF EXISTS (SELECT bno
             FROM book
             WHERE NEW.bno = book.bno)
  AND (SELECT stock
       FROM book
       WHERE NEW.bno = book.bno)>0
  THEN UPDATE book
       SET stock = stock-1
       WHERE NEW.bno = book.bno;
                               ^ here
  ELSE SIGNAL SQLSTATE '45000'
       SET MESSAGE_TEXT = 'Book doesn\'t exist or out of stock';
                                                               ^ here
  END IF;
        ^ here, because IF/THEN/ELSE/END IF counts as a compound statement
END;

即使在代码块中终止语句也是许多编程语言的共同特性,例如C、Java、PHP等。

您应该阅读有关复合语句语法的MySQL手册,特别是本页:https://dev.mysql.com/doc/refman/8.0/en/begin-end.html

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71575341

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档