Skip to content

Цікаві інсерти в mysql

Приступимо одразу до прикладу.

Нехай у нас є таблиця юзерів, їхніх книжок, і їх кількість.


Маємо запис, що 13-й юзер має 5 книжок під номером 1001.

Результат:

А тепер, якщо ми простим інсертом додамо юзеру ще одну книжку, то получимо ще один рядок. А нам він нафіг не потрібен 🙂
Потрібно буде робити 2 запити: спочатку перевірити чи є в нього щось, а потім інсертити або апдейтити 🙁

Я пропоную інше рішення.

Виставляємо ключі:

1) Якщо вже є запис і потрібно додати кількість.

Результат:

2) Якщо вже є запис – то нічого не міняти (ігнор).

Результат:

3) Навіть якщо вже є запис – ми всеодно замінимо його новим.

Результат:


Доречі, при правильному написанні запитів, цієї помилки не повинно бути.

3 Comments

  1. не треба ніяких складних операторів, просто по-інакшому зробити архітектуру бд.

    має бути 3 таблиці:

    1. users(user_id, books_count)
    2. books_users(book_id, user_id)
    3. books(book_id)

    класичний випадок багато-до-багатьох.

    коли створюється новий юзер в нього books_count = 0;
    коли додається нова книжка до певного юзера то додаємо запис в books_users і оновлюємо books_count для юзера; це, звичайно, треба робити у транзакції.

  2. агаа, сорі, я не дочитав повністю – може бути декілька однакових книжок! так, тоді в проміжній таблиці має бути кількість однакових книжок і тоді має бути в коді цей if (insert чи update), про який йдеться. все просто.

  3. В топіку треба давати більше інформації, новачкам вона потрібна

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *