Хитрі запити в mysql insert ignore, on duplicate key update

В 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.