Архив

Архив рубрики «MySQL&»

MySQL одновременный SELECT и UPDATE при работе с одной таблицей

05 Мар 2012

MySQL не позволит вам сделать выборку данных SELECT из таблицы в тот момент, когда одновременно делается обновление данных UPDATE той же таблицы.
Т.е. нижеприведенный пример – недопустимый:


UPDATE table_1 AS tbl_1
    SET tbl_1.cnt = (
        SELECT COUNT(*) FROM table_1 AS tbl_2
        WHERE tbl_1.type = tbl_2.type
    );
Error: You can't specify target table 'tbl_1' for update in FROM clause

В такой ситуации нужно использовать связывание таблицы с собой. Присоединяемая таблица будет реализована через временную таблицу, поэтому подзапрос откроет и закроет таблицу до того, как UPDATE откроет её. Таким образом данный запрос будет успешно выполнен:


UPDATE table_1 AS tbl_1
    INNER JOIN(
        SELECT type, COUNT(*) AS cnt
        FROM table_1
        GROUP BY type
    ) AS tbl_2 USING(type)
SET tbl_1.cnt = tbl_2.cnt;

MySQL , ,

MySQL. Выборка записей в случайном порядке.

03 Фев 2011

В случае, когда из таблицы нужно выбрать записи и при этом отсортировать их случайным образом, крайне не желательно использовать запрос следующего вида:


SELECT * FROM table_name ORDER BY RAND() LIMIT 1000

Нежелательной, с точки зрения производительности, является конструкция
ORDER BY RAND()
В таких случаях более производительным вариантом будет использование следующей хранимой процедуры с последующим запросом:
Читать полностью…

MySQL , ,

MySQL MOD

26 Окт 2010

Очередная ошибка выполнения запроса.


SELECT mod FROM user;

На первый взгляд ничего криминального, но поскольку MySQL не хочет выполнять запрос – возникает подозрение, что mod – зарезервированное слово.
На самом деле MOD – это SQL функция!
MOD(N, M) – возвращает, как и во многих языках программирования, остаток от деления числа N на число M.
Угораздило ж меня назвать так поле таблицы. :)

Ошибка исправляется заключением имени поля в кавычки (те, что на клавише с буквой Ё).


SELECT `mod` FROM user;

Вот, даже CSS класс, подсвечивающий код, понимает это.

MySQL ,

MySQL DELETE синтаксическая ошибка

08 Июн 2010

Есть ли синтаксическая ошибка в следующем SQL-запросе?

DELETE FROM mytable t WHERE t.id IN (1,2,3,4,5)

Ошибка есть! Правда, я не сразу понял, в чем дело и почему MySQL не хочет пропускать запрос.

Правильным будет любой из следующих вариантов:


DELETE FROM mytable WHERE id IN (1,2,3,4,5);
DELETE t FROM mytable t WHERE t.id IN (1,2,3,4,5);

Суть в том, что если используете алиас для таблицы, то его нужно указать после DELETE.

Или можно указать имя таблицы вместо алиаса.

СУБД должна знать из какой таблицы производить удаление.

Более понятна такая логика MySQL будет при использовании JOIN-синтаксиса оператора DELETE, или просто при удалении из нескольких таблиц:


-- удаление произойдет только из таблицы table1
DELETE t1 FROM table1 t1
INNER JOIN table2 t2 ON t1.id = t2.table1_id
WHERE t1.id IN (1,2,3,4,5)

-- удалятся данные из таблиц table1 и table2
DELETE t1, t2
FROM table1 t1, table2 t2, table3 t3
WHERE t1.id=t2.id AND t2.id=t3.id

MySQL , , ,