【问题标题】:Error 1172 - Result consisted of more than one row in MySQL错误 1172 - 结果在 MySQL 中包含多于一行
【发布时间】:2020-04-27 00:05:01
【问题描述】:

我正在尝试创建一个函数来检查 book 表中是否存在一本书的键,如果存在,它会确定该书在库存表中的数量,以及已售出的数量购买的物品表。当我尝试运行我当前的代码时,每次运行它时都会显示“结果包含多于一行”,无论值如何。我不清楚如何调整它。

DELIMITER //

CREATE FUNCTION quantity_on_stock(
    book_key INT
)
RETURNS INT
READS SQL DATA
BEGIN
    DECLARE num_books_recieved INT;
    DECLARE num_books_sold INT;
    DECLARE book_key_var INT;
    DECLARE book_inventory_key_var INT;

    SELECT book_key
    INTO book_key_var
    FROM books
    WHERE book_key = books.book_key;

    IF book_key = book_key_var THEN
        SELECT quantity INTO num_books_recieved FROM book_inventory bi WHERE book_key = bi.book_key;
        SELECT book_inventory_key INTO book_inventory_key_var FROM book_inventory bi WHERE book_key = bi.book_key;
        SELECT quantity INTO num_books_sold FROM purchase_items pi WHERE book_inventory_key_var = pi.book_inventory_key;
    END IF;

    RETURN (num_books_recieved - num_books_sold);
END//

DELIMITER ;

Book_key 是图书库存表中的 FK。 Book_inventory_key 是 purchase_items 表中的一个外键。

【问题讨论】:

  • 错误信息的哪一部分你不明白?您正在使用 into 并且可能会获得多行。
  • 如果不使用 INTO 语句,我不确定如何编写。

标签: mysql sql stored-functions


【解决方案1】:

将 LIMIT 1 添加到您的查询中:

SELECT book_key
INTO book_key_var
FROM books
WHERE book_key = books.book_key
LIMIT 1;

【讨论】:

    【解决方案2】:

    这个逻辑:

      SELECT quantity INTO num_books_recieved 
      FROM book_inventory bi
      WHERE book_key = bi.book_key;
    

    不按照你的想法去做。第一个book_key 也指列——列在变量之前匹配。

    原来如此:

      SELECT quantity INTO num_books_recieved 
      FROM book_inventory bi
      WHERE bi.book_key = bi.book_key;
    

    我建议将变量重命名为不与列名冲突的名称。

    【讨论】:

      猜你喜欢
      • 2012-03-19
      • 2011-01-15
      • 1970-01-01
      • 1970-01-01
      • 2018-03-07
      • 2021-03-21
      • 1970-01-01
      • 1970-01-01
      • 2023-03-21
      相关资源
      最近更新 更多