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
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
Я не уверен, что любой из них отвечает на вопрос, который был задан. Я даже не уверен, что был задан вопрос.
date
- зарезервированное слово, должно быть в ``, и если поле имеет типdate
, эта операция ничего не сделает