Рассмотрим следующий пример:
MySQL таблица (table
) со структурой id
(Основной ключ), value
, unique_id
существует.
Всякий раз, когда пользователь нажимает на Button A
PHP выполняет следующий запрос:
SELECT `id` FROM `table` WHERE `unique_id` = x; //where x is a `unique_id`
Если запрос ничего не возвращает (т.е. x
еще не существует в unique_id
столбец), новая строка вставляется в table
(с x
в unique_id
колонка).
… Продолжая эту логику:
Запрос выполняется при просмотре Page A
:
SELECT `id` FROM `table` WHERE `unique_id` = x;
Сегодня я получил следующую ошибку:
SQLSTATE[21000]: Cardinality violation: 1242 Subquery returns more than 1 row
Это первый раз, когда я столкнулся с этой проблемой (с таблицей, превышающей 20 тыс. Строк).
Возможно ли, что если два отдельных пользователя оба нажали на Button A
точно в один и тот же момент времени (вплоть до миллисекунды) эти две строки могут быть записаны с повторяющимися значениями в unique_id
столбец?
Если так, как я могу избежать этого в будущем? (Я принимаю неправильный подход здесь?).
При подходе, который вы используете, ответ, скорее всего, может быть создан две записи. Первое, что нужно сделать, это на самом деле создать UNIQUE INDEX
на ваше unique_id
колонка. По вашему вопросу, похоже, нет.
Это поднимает другой вопрос. Вам действительно нужны оба id
а также unique_id
в твоей таблице? Может быть возможно использовать только один или другой.
Если вы уронили unique_id
и полагался только на первичный ключ и преобразовал его в поле автоматического приращения, эта проблема не существовала бы.
Если вы хотите продолжить свой текущий подход, добавьте уникальный индекс, а затем выполните ВСТАВЬТЕ сначала.
Других решений пока нет …