【问题标题】:mySQL finding available book and loaning itmySQL 查找可用书籍并借出
【发布时间】:2017-02-01 23:57:45
【问题描述】:

我已经创建了一个图书馆系统,我正在尝试设置一个程序,该程序允许您输入 isbn 和学号,然后它会检查数据库以查看该书是否可用,如果可用,请预订。如果没有,则给出错误消息。

我的表格如下:

  • 书 - pk_isbn,作者,书名
  • 复制 - pk_code、持续时间、fk_isbn
  • 贷款 - fk_code、fk_no、pk_taken、due、return_date
  • 学生 - pk_no,姓名,学校,allowtobook

这是我目前拥有的代码 *有些只是我猜的伪代码,因为它目前根本不起作用。

DELIMITER $$
CREATE PROCEDURE issue_loan (IN book_isbn CHAR(17), IN stu_no INT)

BEGIN

DECLARE availablebooks INT;
DECLARE allowedtobook BIT;

SET availablebooks = (SELECT DISTINCT
        c.isbn
    FROM
        loan l
            INNER JOIN
        student s ON l.no = s.no
            INNER JOIN
        copy c ON l.code = c.code
    WHERE
        return_date IS NOT NULL);

IF(availablebooks = book_isbn) AND s.embargo = 0 THEN
INSERT INTO loan VALUES
(code, stu_no, CURDATE(), CURDATE()+c.duration,'');
ELSE 
SIGNAL SQLSTATE '450000' SET MESSAGE_TEXT ='no Books Available';
END IF;

END$$

return_date IS NOT NULL 部分应该是正确的,因为它会找到尚未归还的任何书籍。这意味着他们目前已被预订一空。

【问题讨论】:

  • 这里真的没有任何程序,是吗?你不需要程序。你只需要一个查询。

标签: mysql sql database


【解决方案1】:

您不能将变量设置为查询结果集,一个变量只能保存一个值。您只需将与book_isbns.embargo = 0 的比较添加到查询中即可。

SET @book_available = (SELECT COUNT(*)
    FROM loan l
    INNER JOIN student s ON l.no = s.no
    INNER JOIN copy c ON l.code = c.code
    WHERE c.fk_isbn = book_isbn AND s.embargo = 0 AND l.return_date IS NULL);

IF @book_available
THEN 
    INSERT INTO loan (fk_code, fk_no, pk_taken, due, return_date)
    VALUES (code, stu_no, CURDATE(), CURDATE()+c.duration,'');
ELSE SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT ='no Books Available';
END IF

【讨论】:

  • 谢谢我知道我的逻辑有点走上正轨,但我对 sql 太陌生了,我还没有完全了解语法。我现在就测试一下,看看效果如何
  • 其实有一件事我忘了提,如何正确设置信号?我收到一个错误“bad SQLSTATE”,如果不满足 IF 语句的条件,我只想返回错误消息。嗯,我现在已经删除了信号,一切正常,但是如果我输入我想借出的书的 ISBN 并且学生号没有更新,我会得到输出:“Call issue_loan(235235235, 2333)”但是没有任何东西被插入到贷款表中。即使这本书实际上是可用的。
  • 我认为 450000 可能太高了。手册中的示例使用 45000,可能限制为 5 位。
  • 我现在已经开始工作了,只是有了一些逻辑来弄清楚信号,但总的来说一切都按预期工作。非常感谢。我曾经说过我应该查看循环和游标来执行此操作的提示,但是我不确定这是否有必要。你有没有看到任何可以使用的地方?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-14
  • 1970-01-01
  • 1970-01-01
  • 2021-01-06
  • 2016-10-29
  • 2011-12-10
  • 1970-01-01
相关资源
最近更新 更多