Неожиданное нарушение кардинальности (подзапрос возвращает более 1 строки)

Рассмотрим следующий пример:

MySQL таблица (table) со структурой id (Основной ключ), value, unique_id существует.

Всякий раз, когда пользователь нажимает на Button APHP выполняет следующий запрос:

SELECT `id` FROM `table` WHERE `unique_id` = x; //where x is a `unique_id`

Если запрос ничего не возвращает (т.е. x еще не существует в unique_id столбец), новая строка вставляется в tablex в 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 столбец?

Если так, как я могу избежать этого в будущем? (Я принимаю неправильный подход здесь?).

1

Решение

При подходе, который вы используете, ответ, скорее всего, может быть создан две записи. Первое, что нужно сделать, это на самом деле создать UNIQUE INDEX на ваше unique_id колонка. По вашему вопросу, похоже, нет.

Это поднимает другой вопрос. Вам действительно нужны оба id а также unique_id в твоей таблице? Может быть возможно использовать только один или другой.
Если вы уронили unique_id и полагался только на первичный ключ и преобразовал его в поле автоматического приращения, эта проблема не существовала бы.

Если вы хотите продолжить свой текущий подход, добавьте уникальный индекс, а затем выполните ВСТАВЬТЕ сначала.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]