Обновление Mysql обновлено неожиданно

0

Для обновления таблицы MySql я использовал query-

update TABLE set status=1 and finalStatus_id=1 and id in (1,3,4);

Я ошибочно написал и вместо того, где и выполнил запрос.

По запросу я ожидал ERROR, но он успешно работал. Во-вторых, я должен был обновить статус всех строк как 1. Но, статус всех строк обновился до 0. (Почему это?)

Я попытался выяснить причину и smililar использование запроса, но не могу найти. Почему это? Почему он так себя вел?

Теги:
sql-update
mysqli

2 ответа

2
Лучший ответ

Ваш код интерпретируется как:

update TABLE
    set status = (1 and (finalStatus_id = 1) and (id in (1, 3, 4));

Это логическое выражение. Это будет только "1" (true), когда id равен 1, 3 или 4, а значение finalStatus_id равно 1. Если все строки установлены в 0, это никогда не будет истинным.

Запрос, который вы хотите, предположительно:

update TABLE
    set status = 1,
        finalStatus_id = 1 
where id in (1, 3, 4);

Запятые используются для разделения обновлений на отдельные столбцы, а не на логические and.

1

В SQL предложение WHERE является необязательным. Это юридический синтаксис для обновления каждой строки в таблице, которую вы можете сделать, опуская предложение WHERE.

UPDATE table SET status=1;

Возможно, это не хороший дизайн языка, чтобы сделать по умолчанию то, что ваше обновление будет применяться к каждой строке, но этот стандартный синтаксис SQL, к лучшему или к худшему.

У клиента MySQL есть флаг --safe-updates который предотвращает случайное выполнение таких запросов. Он обрабатывает запрос как ошибку, если он UPDATE или DELETE и не имеет предложения WHERE. Это работает только в клиенте MySQL, а не в программном интерфейсе. Таким образом, это не работает, если вы делаете ту же ошибку в коде приложения.

Следующая часть состоит в том, что вы устанавливаете свой status в выражении. Выражение может быть простым значением типа 1, но оно также может быть более сложным выражением.

Это юридическое выражение:

1 and finalStatus_id=1 and id in (1,3,4)

Поскольку 1 - это то же самое, что и true, это законный операнд для and. Остальные два условия также являются булевыми условиями.

Результатом всех выражений является логическое значение true или false, которое в MySQL эквивалентно 1 или 0.

Таким образом, вы применили это выражение к каждой строке в своей таблице. Конечно, это будет false в каждой строке, где id не находится (1,3,4).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню