Для обновления таблицы MySql я использовал query-
update TABLE set status=1 and finalStatus_id=1 and id in (1,3,4);
Я ошибочно написал и вместо того, где и выполнил запрос.
По запросу я ожидал ERROR, но он успешно работал. Во-вторых, я должен был обновить статус всех строк как 1. Но, статус всех строк обновился до 0. (Почему это?)
Я попытался выяснить причину и smililar использование запроса, но не могу найти. Почему это? Почему он так себя вел?
Ваш код интерпретируется как:
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
.
В 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).