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

0

Прежде чем я перейду к своему вопросу, я хочу, чтобы вы знали, что на прошлой неделе я начал изучать 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"

"custom" - временная таблица, поэтому я предполагаю, что, что вызывает проблему, как я могу работать вокруг нее? Я не могу просто создать обычную таблицу каждый раз, потому что я хочу, чтобы она работала в многопользовательской среде

  • 0
    временные таблицы ограничены сессией / соединением, что означает, что клиент PHP MySQL, который создал временную таблицу, может только получить к ней доступ. Поэтому вам необходимо включить создание временной таблицы в этот код перед созданием SP ROWPERROW2
  • 0
    Создание временной таблицы действительно включено в код, я просто отбросил строки кода, где она была создана, я обновил пост, чтобы вы могли видеть.
Теги:
temp-tables

1 ответ

0

Нашел работу, она некрасивая, но она работает. Я сделал несколько временных таблиц на основе исходной таблицы temp ("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;
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню