MYSQL Ошибка обновления записи: невозможно открыть таблицу (временная таблица)

Прежде чем перейти к моему вопросу, я хочу, чтобы вы знали, что я начал изучать 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» — это временная таблица, так что я думаю, что именно это и является причиной проблемы, как я могу обойти ее? Я не могу просто создать нормальную таблицу каждый раз, потому что хочу, чтобы она работала в многопользовательской среде

0

Решение

Нашел работу вокруг, это не красиво, но работает.
Я создал несколько временных таблиц на основе исходной временной таблицы («содержимое»), а затем использовал их в процедуре, чтобы каждая таблица использовалась только один раз, например:

                 $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;
}
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]