Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Почему может не обновляться CURRENT_TIMESTAMP ON UPDATE? / 9 сообщений из 9, страница 1 из 1
07.11.2015, 20:00:11
    #39097351
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему может не обновляться CURRENT_TIMESTAMP ON UPDATE?
Есть таблица с полем CHANGED:
Код: sql
1.
`CHANGED` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP



Эту таблицу я синхронизирую с внешним источником.
Я предполагал, что алгоритм будет следующим:
0. Отключение autocommit, unique_checks, foreign_key_checks и т.п.
1. update TABLE set CHANGED = null
2. insert into TABLE (f1,f2,f3) values (?,?,?), (?,?,?), (?,?,?) on duplicate key update f1=values(f1), f2=values(f2), f3=values(f3)
3. commit
4. delete from TABLE where CHANGED = null
5. commit

Пункты 2-3 могут повторяться несколько раз (вставка осуществляется блоками по 100 строк).

Но в результате в таблице TABLE оказывается произвольное содержимое.
Если таблица изначально таблица была пуста, то загружаются все строки.
Если таблица была не пуста, в таблицу загружаются не все строки (а иногда и ни одной).

Логики я пока не уловил, по похоже что не при всяких on duplicate key update обновляется поле CHANGED.
Если запрос в пункте 2 написать так:
Код: sql
1.
insert into TABLE (f1,f2,f3) values (?,?,?), (?,?,?), (?,?,?) on duplicate key update changed=current_timestamp, f1=values(f1), f2=values(f2), f3=values(f3)


то строки всегда загружаются нормально (т.е. загружаются все строки).
Однако мне непонятно, почему такое поведение.
Это глюк/баг MySQL или я что-то не учитываю?

________________________
Мы смотрим с оптимизмом...
...в оптический прицел.
...
Рейтинг: 0 / 0
09.11.2015, 01:45:13
    #39097888
anvano
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему может не обновляться CURRENT_TIMESTAMP ON UPDATE?
Тут скорее надо документацию читать:
11.3.5 Automatic Initialization and Updating for TIMESTAMP and DATETIME

Если значения обновляемых полей (f1,f2,f3) не меняются, то автоапдейта не происходит.

For any TIMESTAMP or DATETIME column in a table, you can assign the current timestamp as the default value, the auto-update value, or both:

- An auto-initialized column is set to the current timestamp for inserted rows that specify no value for the column.

- An auto-updated column is automatically updated to the current timestamp when the value of any other column in the row is changed from its current value. An auto-updated column remains unchanged if all other columns are set to their current values. To prevent an auto-updated column from updating when other columns change, explicitly set it to its current value. To update an auto-updated column even when other columns do not change, explicitly set it to the value it should have (for example, set it to CURRENT_TIMESTAMP).


Собственно когда вы пишете запрос как во втором примере:
Код: plsql
1.
insert into TABLE (f1,f2,f3) values (?,?,?), (?,?,?), (?,?,?) on duplicate key update changed=current_timestamp, f1=values(f1), f2=values(f2), f3=values(f3)


то это как раз и есть explicitly set it to the value it should have из документации

А для исходного варианта - когда значения полей f1,f2,f3 при вставке не меняются (то есть вставляется то же, что уже было) то апдейта не происходит, опять же согласно документации. Это и есть ваша "закономерность". В значениях вставляемых полей.

Во.
...
Рейтинг: 0 / 0
09.11.2015, 08:34:13
    #39097944
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему может не обновляться CURRENT_TIMESTAMP ON UPDATE?
То есть MySQL перед обновлением проверяет предыдущие значения полей. Неожиданный бонус, но тогда все понятно.
А это разве не будет негативно сказываться на производительности?
...
Рейтинг: 0 / 0
09.11.2015, 08:57:48
    #39097954
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему может не обновляться CURRENT_TIMESTAMP ON UPDATE?
Alibek B.MySQL перед обновлением проверяет предыдущие значения полей. Неожиданный бонус, но тогда все понятно.
А это разве не будет негативно сказываться на производительности?
Проверка не-изменения полей (выполняемая только в оперативной памяти) однозначно дешевле, чем безусловная запись тех же значений (и непременные дисковые операции).
...
Рейтинг: 0 / 0
09.11.2015, 09:39:30
    #39097989
Alex_Ustinov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему может не обновляться CURRENT_TIMESTAMP ON UPDATE?
Alibek B.,

добавьте другое контрольное доп.поле, например
`keyupdate` int NOT NULL DEFAULT '0'
...
Рейтинг: 0 / 0
09.11.2015, 09:47:36
    #39097994
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему может не обновляться CURRENT_TIMESTAMP ON UPDATE?
У нас на форуме пробегали решения вида on duplicate key update ... special_field=1-special_field, где special_field - специальное поле (одного байта NOT NULL достаточно), которое существует только для того, чтобы заставить MySQL обновить данные в записи.
...
Рейтинг: 0 / 0
09.11.2015, 09:56:05
    #39098005
Alibek B
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему может не обновляться CURRENT_TIMESTAMP ON UPDATE?
AkinaПроверка не-изменения полей (выполняемая только в оперативной памяти) однозначно дешевле, чем безусловная запись тех же значений (и непременные дисковые операции).
Но прежде чем выполнить проверку в оперативной памяти, значения полей нужно загрузить.
...
Рейтинг: 0 / 0
09.11.2015, 10:01:46
    #39098010
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему может не обновляться CURRENT_TIMESTAMP ON UPDATE?
Alibek B.AkinaПроверка не-изменения полей (выполняемая только в оперативной памяти) однозначно дешевле, чем безусловная запись тех же значений (и непременные дисковые операции).
Но прежде чем выполнить проверку в оперативной памяти, значения полей нужно загрузить.Загрузка блока(-ов) с записью происходит всегда, так что тут ничего не меняется.
...
Рейтинг: 0 / 0
09.11.2015, 11:48:57
    #39098150
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему может не обновляться CURRENT_TIMESTAMP ON UPDATE?
Alibek B.прежде чем выполнить проверку в оперативной памяти, значения полей нужно загрузить.
Это делается в любом случае, вне зависимости от того, будет меняться значение или нет.
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Почему может не обновляться CURRENT_TIMESTAMP ON UPDATE? / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]