Встроенный функционал MySQL

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

ON DUPLICATE KEY UPDATE

Например, есть таблица с какими-то объектами (пользователи, посты и т.д.). Если данный объект с таким-то уникальным свойством уже существует, то апдейтим какое-то свойство у него. Если объекта не существует, то вставляем новую строку. Часто можно встретить такой код:

// находим объект
$row = query('SELECT * FROM table WHERE id=1');
// проверяем есть ли такой объект
if ($row) {
// делаем апдейт
query('UPDATE table SET column=column+1 WHERE id=1');
}
else {
// делаем вставку
query('INSERT INTO table SET column=1, id=1');
}

Подобную конструкцию можно заменить одним запросом без участия php, при условии наличия первичного или уникального ключа по полю id:
INSERT INTO table SET column = 1, id=1 ON DUPLICATE KEY UPDATE column = column + 1

INSERT IGNORE

Зачастую при добавление в таблицу, имеющей UNIQUE индекс или PRIMARY KEY, новой строки, очень полезным бывает синтаксис INSERT IGNORE. Использование данного синтаксиса удобно в случае случайного дублирования ключа при вставке, то есть сама вставка не будет произведена, при этом не будет прекращено выполнение.
Обычный алгоритм:
1) проверить наличие строки в таблице по ключу (SELECT)
2) вставить строку в случае отсутствия дублирования ключа (INSERT)

// находим объект
$row = query('SELECT * FROM table WHERE id=1');
// если такого объекта нет, то вставляем новую запись
if (!$row) {
query('INSERT INTO table …');
}

Теперь напишем только один запрос INSERT IGNORE без участия php
query('INSERT IGNORE INTO table …') // вставка

Не нужно придумывать свои алгоритмы и писать лишний код – пусть за вас думает MySQL.

Английский язык для начинающих
#1

Спасибо за статью, помогла при освоение предумдростей MySQL:)

Combox, 13.01.2010 - 00:05
#2

Спасибо.
Я только начинаю - читал книжку - но не совсем понимал как работать с UNIQUE
А тут на тебе - в двух строках все объяснили.
Ещё раз спасибо.

Иван, 1.03.2010 - 16:15
#3

Спасибо. Избавил меня как минимум от одного велосипеда, да.

Д., 27.05.2010 - 12:37
#4

Про INSERT IGNORE незнал, спасибо.

Евгений Че, 13.06.2010 - 13:52
#5

Вау! Спасибо за пост! Где-то в мануалах встречал про IGNORE, но не обращал должного внимания.

>К сожалению, не все программисты знают об этом и используют свои «велосипеды».

Не многие изучают доки досконально. А в книгах о таком пишут редко, т.к. большинство книг рассчитано на новичков для поднятия базовых знаний Mysql.

Kreker, 7.07.2010 - 09:48
#6

лучше использовать PRIMARY KEY, у меня с UNIQUE избавиться от дублирования не получилось

Альберт Иванов, 20.08.2010 - 14:19