【问题标题】:MYSQL Error updating record: Can't reopen table (Temporary table)MYSQL 更新记录时出错:无法重新打开表(临时表)
【发布时间】:2018-09-19 14:31:56
【问题描述】:

在我回答我的问题之前,我想让你知道我上周开始学习 MYSQL 和 PHP,所以这可能是你一段时间以来见过的最糟糕的编码。

借口够了,这是我的问题,同时执行以下 PHP 脚本:

           if($hdd!==0){
                  $sql="CREATE TEMPORARY TABLE custom AS SELECT * from `builds`;";
                $conn->query($sql);
                 if($hdd==1){
                 $sql="UPDATE custom SET HDD = null;";
                $conn->query($sql);
            }

                $conn->query("DROP PROCEDURE IF EXISTS ROWPERROW2;");
$conn->query("CREATE PROCEDURE ROWPERROW2()
BEGIN
DECLARE n INT DEFAULT 0;

DECLARE i INT DEFAULT 1;
DECLARE price INT DEFAULT 0;

SELECT COUNT(*) FROM custom INTO n;
SET i=1;

SET price=0;
WHILE i<=n DO 
SET price = (SELECT sum(`lowestPrice`) FROM ((SELECT `lowestPrice` FROM products WHERE name IN (SELECT `Motherboard` from `custom` Where `id`=i )) UNION (SELECT `lowestPrice` FROM products WHERE name IN (SELECT `Cooling` from `custom` Where `id`=i )) UNION (SELECT `lowestPrice` FROM products WHERE name IN (SELECT `PC_Case` from `custom` Where `id`=i )) UNION (SELECT `lowestPrice` FROM products WHERE name IN (SELECT `PSU` from `custom` Where `id`=i )) UNION (SELECT `lowestPrice` FROM products WHERE name IN (SELECT `GPU` from `custom` Where `id`=i )) UNION (SELECT `lowestPrice` FROM products WHERE name IN (SELECT `Memory` from `custom` Where `id`=i )) UNION (SELECT `lowestPrice` FROM products WHERE name IN (SELECT `SSD` from `custom` Where `id`=i )) UNION (SELECT `lowestPrice` FROM products WHERE name IN (SELECT `HDD` from `custom` Where `id`=i )) UNION (SELECT `lowestPrice` FROM products WHERE name IN (SELECT `CPU` from `custom` Where `id`=i ))) as A);
UPDATE custom SET `TotalPrice`=price WHERE `id`=i;
SET i = i + 1;
END WHILE;
End;");
                if ($conn->query("CALL ROWPERROW2();") === TRUE) {
    echo "Builds Record updated successfully";
} else {
    echo "Error updating record: " . $conn->error;
}
            }

我收到以下错误:

更新记录时出错:无法重新打开表:“自定义”

“custom”是一个临时表,所以我想这就是导致问题的原因,我该如何解决它?我不能每次都创建一个普通表,因为我希望它在多用户环境中工作

【问题讨论】:

  • 临时表是会话/连接有界的,这意味着制作临时表的 PHP MySQL 客户端只能访问它。所以在创建 SP 之前,您需要在此代码中包含临时表的创建ROWPERROW2
  • 临时表的创建确实包含在代码中,我只是将创建它的代码行删除了,我更新了帖子以便您查看。

标签: php mysql temp-tables


【解决方案1】:

找到了一个解决方法,它不是很漂亮,但它有效。 我所做的是根据原始临时表('contents')创建多个临时表,然后在过程中使用它们,因此每个表只使用一次,如下所示:

                 $conn->query(" CREATE TEMPORARY TABLE t1 AS SELECT * FROM custom;");
                 $conn->query(" CREATE TEMPORARY TABLE t2 AS SELECT * FROM custom;");
                $conn->query(" CREATE TEMPORARY TABLE t3 AS SELECT * FROM custom;");
                $conn->query(" CREATE TEMPORARY TABLE t4 AS SELECT * FROM custom;");
                $conn->query(" CREATE TEMPORARY TABLE t5 AS SELECT * FROM custom;");
                $conn->query(" CREATE TEMPORARY TABLE t6 AS SELECT * FROM custom;");
                $conn->query(" CREATE TEMPORARY TABLE t7 AS SELECT * FROM custom;");
                $conn->query(" CREATE TEMPORARY TABLE t8 AS SELECT * FROM custom;");
                $conn->query(" CREATE TEMPORARY TABLE t9 AS SELECT * FROM custom;");

并更改了程序,使其每个表只使用一次:

$conn->query("CREATE PROCEDURE ROWPERROW2()
BEGIN
DECLARE n INT DEFAULT 0;

DECLARE i INT DEFAULT 1;
DECLARE price INT DEFAULT 0;

SELECT COUNT(*) FROM builds INTO n;
SET i=1;

SET price=0;
WHILE i<=n DO 
SET price = (SELECT sum(`lowestPrice`) FROM ((SELECT `lowestPrice` FROM products WHERE name IN (SELECT `Motherboard` from `t1` Where `id`=i )) UNION (SELECT `lowestPrice` FROM products WHERE name IN (SELECT `Cooling` from `t2` Where `id`=i )) UNION (SELECT `lowestPrice` FROM products WHERE name IN (SELECT `PC_Case` from `t3` Where `id`=i )) UNION (SELECT `lowestPrice` FROM products WHERE name IN (SELECT `PSU` from `t4` Where `id`=i )) UNION (SELECT `lowestPrice` FROM products WHERE name IN (SELECT `GPU` from `t5` Where `id`=i )) UNION (SELECT `lowestPrice` FROM products WHERE name IN (SELECT `Memory` from `t6` Where `id`=i )) UNION (SELECT `lowestPrice` FROM products WHERE name IN (SELECT `SSD` from `t7` Where `id`=i )) UNION (SELECT `lowestPrice` FROM products WHERE name IN (SELECT `HDD` from `t8` Where `id`=i )) UNION (SELECT `lowestPrice` FROM products WHERE name IN (SELECT `CPU` from `t9` Where `id`=i ))) as A);
UPDATE custom SET `TotalPrice`=price WHERE `id`=i;
SET i = i + 1;
END WHILE;
End;");
                if ($conn->query("CALL ROWPERROW2();") === TRUE) {
    echo "Builds Record updated successfully";
} else {
    echo "Error updating record: " . $conn->error;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-19
    • 1970-01-01
    • 1970-01-01
    • 2010-09-25
    • 2018-06-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多