Встроенный функционал 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
#7

Very true! Makes a chnage to see someone spell it out like that. :)

Cady, 19.07.2011 - 13:15
#8

Спасибо! Прямо 'велосипед' с плеч долой!

Dinchel, 30.11.2011 - 18:35
#9

Молодец! И мне помог! Только не insert ignore, а другой функцией. Ты - хороший человек.

Alish, 26.12.2011 - 09:41
 
английский язык для начинающих
Ашманов Египет Москва РХТУ Россия США Снежинск Таиланд Тушино Урал Челябинская область Яндекс алкоголь английский язык баги база данных безопасность бизнес блоги взлом видео выставка выходные горные лыжи дайвинг дауншифтинг допинг идиотизм инвентарь интернет книги кэширование мозг море музей ноутбук образование оптимизация отдых отпуск пароль плагин пора сваливать программирование программисты путешествия работа работоспособность радиация реклама самогоноварение собеседование социальные сети спам стартап статистика страны тайм-менеджмент техника учеба фантастика фото фриланс хакер экология электронные деньги юмор Ajax CMS DbSimple DDOS email FireFox Google honda htaccess HTML javascript jQuery life md5 MySQL PHP SEO soft SQL vkontakte Web web 2.0 wordpress