2016-09-08 2 views
1

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

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

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

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

Если запрос ничего не возвращает (IE 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?

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

+0

Здесь я не вижу подзапроса. Я что-то упускаю? –

ответ

3

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

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

Если вы хотите продолжить свой текущий подход, добавьте уникальный индекс, а затем сделайте INSERT первым.

Смежные вопросы