Временные таблицы и работа с ними

234
23 августа 2017, 18:54
$query2="CREATE TEMPORARY TABLE IF NOT EXISTS '".$territory."' SELECT ter_name,ter_address,ter_type_id,ter_level,ter_mask,reg_id FROM t_koatuu_tree where reg_id  = ".$territory." AND t_koatuu_tree.ter_type_id BETWEEN 2 and 3";
    $db->query($query2);
    $query ="SELECT * FROM '".$territory."'";
    echo 'temp'.$query."<br>".'not temp'.$query2."<br>";

    $result = $db->query($query);

Запрос идет, но временная таблица не создается.

Как правильно было работать с временной таблицей?

Answer 1

Запрос идет, но временная таблица не создается.

Запрос CREATE TABLE ... SELECT не умеет создавать временные таблицы и не допускает модификатора IF NOT EXISTS.

Если Вам необходима строго TEMPORARY TABLE - придётся, как в обсуждении вопроса написал Алексей Шиманский, первым запросом (CREATE) создавать, вторым (INSERT) наполнять.

Если можно обойтись статической таблицей (использование БД строго однопользовательское или не влом создавать и удалять таблицы с уникальными именами для каждого подключения) - тогда можете смело использовать CREATE TABLE ... SELECT.

ВАЖНОЕ ЗАМЕЧАНИЕ. И в первом, и во втором случае таблица будет создана (если не указать иначе) на дефолтном движке, почти наверняка это MyISAM - так что если не хочется попусту дёргать жёсткий диск (а судя по описанию, это так), укажите явно использование движка Engine=MEMORY. Тогда на диск будет записана только структура таблицы, а данные останутся в памяти, не трогая диск. 27 записей - это достаточно компактно, чтобы не задумываться об излишнем расходе памяти.

UPDATE: Если принято решение создавать временную таблицу, то самое разумное - вспомнить, что она локальна для соединения, сессии. Т.е. если она вдруг существует - её можно удалить, и никому другому это не помешает (с оговорками, конечно, помешать можно - но только себе самому). А потому ИМХО наиболее разумно поступить так:

DROP TEMPORARY TABLE IF EXISTS `temptable`;
CREATE TEMPORARY TABLE `temptable` (<table definition>) ENGINE = MEMORY;
INSERT INTO `temptable` SELECT <fieldset> FROM `sourcetablename`;

А уж выполнить это одним мультизапросом или тремя отдельными - решайте сами.

READ ALSO
Можете объяснить, как работает этот код?

Можете объяснить, как работает этот код?

Можете объяснить, как работает этот PHP код?

221
Заблокировать доступ к папке№!

Заблокировать доступ к папке№!

Как мне заблокировать доступ к папке если в ней нету нужного аргумента?Например wwwsite

231
Не работает JS скрипт после редиректа

Не работает JS скрипт после редиректа

Имеется страница на OpenServerНа этой странице есть форма, после отправки которой выполняются некоторые манипуляции с базой данных

279
yandex php парсинг

yandex php парсинг

Доброго времени суток, если через curl зайти на wordstat или direct, то он запрашивает логин и парольВопрос такой: как отправить яндексу логин и пароль...

289