Mysql: команда обновления не меняется

0

2017-05-30 → 20170530

 SET SQL_SAFE_UPDATES = 0;

 UPDATE stations.attenuation_smoothed
 SET date = DATE_FORMAT(date, '%Y/%m/%d') 
 WHERE counter = 1;

 SET SQL_SAFE_UPDATES = 1;

Я также попробовал обновление..... replicate

Но таблица не показывает эффекта, запрос выполняется без ошибок, говоря

0 row(s) affected Rows matched: 1  Changed: 0  Warnings: 0
  • 1
    схема таблицы сообщений ... date - зарезервированное слово, должно быть в ``, и если поле имеет тип date , эта операция ничего не сделает
  • 0
    Какой тип данных столбца даты?
Показать ещё 7 комментариев
Теги:

1 ответ

0

MySQL не "подсчитывает" строки, которые не изменяются как "затронутые". То есть, если мы присваиваем значения столбцам, которые приводят к "без изменений" в строке, строка не включается в число "затронутых строк".


В вопросе не указан тип данных столбца с именем date.

Если этот тип данных DATE, мы ожидаем, что оператор UPDATE (как показано в вопросе) не будет изменять какие-либо строки и вернуть "0 строк (строк)".

Если это символ типа данных, и если значение, которое уже сохранено в столбце, находится в формате 'YYYY/MM/DD' представляет действительное значение даты, тогда мы также ожидаем, что возврат будет "0 строк (строк)".


Чтобы продемонстрировать, почему утверждение не вносит никаких изменений в строку, рассмотрите эту демонстрацию:

SELECT DATE_FORMAT('2018-04-12','%Y/%m/%d')                  AS str
     , DATE_FORMAT('2018-04-12','%Y/%m/%d') + INTERVAL 0 DAY AS dt

возвращает:

str         dt
----------  ----------
2018/04/12  2018-04-12

Тип данных DATE является внутренним представлением. MySQL использует стандартный формат YYYY-MM-DD при преобразовании из внутреннего представления в строку символов.

Демонстрационный запрос использует явный вызов DATE_FORMAT для преобразования значения DATE (или DATETIME или TIMESTAMP) в строковое представление в указанном формате.

Обратите внимание, что разделители тире, которые отображаются в строчном представлении, фактически не являются частью значения DATE, это символы, которые отображаются в строчном представлении.

Когда мы назначаем строку столбцу DATE, подразумевается неявное преобразование этой строки в тип данных DATE. И MySQL довольно мягко относится к разделителям и формату. Рассматривать

SELECT DATE( '2018/4/12' ) AS dt1
     , DATE( '2018.4+12' ) AS dt2

Это демонстрирует преобразование строкового значения в тип данных DATE.

dt1         dt2
----------  ----------
2018-04-12  2018-04-12

Чтобы вернуть значение DATE в наборе результатов, MySQL преобразует значение DATE обратно в строковое представление, которое оно преобразует обратно в строковое представление (в формате MySQL по умолчанию).


И чтобы продемонстрировать, почему "нет изменений" в случае, когда date является столбец символов, рассмотрим:

SELECT DATE('2018/04/12')                             AS dt
     , DATE_FORMAT( DATE('2018/04/12') ,'%Y/%m/%d')   AS str

возвращается

dt          str
----------  ----------
2018-04-12  2018/04/12

Я не уверен, что любой из них отвечает на вопрос, который был задан. Я даже не уверен, что был задан вопрос.

Ещё вопросы

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