|
|
|
Почему может не обновляться CURRENT_TIMESTAMP ON UPDATE?
|
|||
|---|---|---|---|
|
#18+
Есть таблица с полем CHANGED: Код: sql 1. Эту таблицу я синхронизирую с внешним источником. Я предполагал, что алгоритм будет следующим: 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. то строки всегда загружаются нормально (т.е. загружаются все строки). Однако мне непонятно, почему такое поведение. Это глюк/баг MySQL или я что-то не учитываю? ________________________ Мы смотрим с оптимизмом... ...в оптический прицел. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2015, 20:00:11 |
|
||
|
Почему может не обновляться CURRENT_TIMESTAMP ON UPDATE?
|
|||
|---|---|---|---|
|
#18+
Тут скорее надо документацию читать: 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. то это как раз и есть explicitly set it to the value it should have из документации А для исходного варианта - когда значения полей f1,f2,f3 при вставке не меняются (то есть вставляется то же, что уже было) то апдейта не происходит, опять же согласно документации. Это и есть ваша "закономерность". В значениях вставляемых полей. Во. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2015, 01:45:13 |
|
||
|
Почему может не обновляться CURRENT_TIMESTAMP ON UPDATE?
|
|||
|---|---|---|---|
|
#18+
То есть MySQL перед обновлением проверяет предыдущие значения полей. Неожиданный бонус, но тогда все понятно. А это разве не будет негативно сказываться на производительности? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2015, 08:34:13 |
|
||
|
Почему может не обновляться CURRENT_TIMESTAMP ON UPDATE?
|
|||
|---|---|---|---|
|
#18+
Alibek B.MySQL перед обновлением проверяет предыдущие значения полей. Неожиданный бонус, но тогда все понятно. А это разве не будет негативно сказываться на производительности? Проверка не-изменения полей (выполняемая только в оперативной памяти) однозначно дешевле, чем безусловная запись тех же значений (и непременные дисковые операции). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2015, 08:57:48 |
|
||
|
Почему может не обновляться CURRENT_TIMESTAMP ON UPDATE?
|
|||
|---|---|---|---|
|
#18+
Alibek B., добавьте другое контрольное доп.поле, например `keyupdate` int NOT NULL DEFAULT '0' ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2015, 09:39:30 |
|
||
|
Почему может не обновляться CURRENT_TIMESTAMP ON UPDATE?
|
|||
|---|---|---|---|
|
#18+
У нас на форуме пробегали решения вида on duplicate key update ... special_field=1-special_field, где special_field - специальное поле (одного байта NOT NULL достаточно), которое существует только для того, чтобы заставить MySQL обновить данные в записи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2015, 09:47:36 |
|
||
|
Почему может не обновляться CURRENT_TIMESTAMP ON UPDATE?
|
|||
|---|---|---|---|
|
#18+
AkinaПроверка не-изменения полей (выполняемая только в оперативной памяти) однозначно дешевле, чем безусловная запись тех же значений (и непременные дисковые операции). Но прежде чем выполнить проверку в оперативной памяти, значения полей нужно загрузить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2015, 09:56:05 |
|
||
|
Почему может не обновляться CURRENT_TIMESTAMP ON UPDATE?
|
|||
|---|---|---|---|
|
#18+
Alibek B.AkinaПроверка не-изменения полей (выполняемая только в оперативной памяти) однозначно дешевле, чем безусловная запись тех же значений (и непременные дисковые операции). Но прежде чем выполнить проверку в оперативной памяти, значения полей нужно загрузить.Загрузка блока(-ов) с записью происходит всегда, так что тут ничего не меняется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2015, 10:01:46 |
|
||
|
Почему может не обновляться CURRENT_TIMESTAMP ON UPDATE?
|
|||
|---|---|---|---|
|
#18+
Alibek B.прежде чем выполнить проверку в оперативной памяти, значения полей нужно загрузить. Это делается в любом случае, вне зависимости от того, будет меняться значение или нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2015, 11:48:57 |
|
||
|
|

start [/forum/topic.php?fid=47&msg=39097994&tid=1832524]: |
0ms |
get settings: |
7ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
37ms |
get topic data: |
8ms |
get forum data: |
3ms |
get page messages: |
42ms |
get tp. blocked users: |
1ms |
| others: | 230ms |
| total: | 341ms |

| 0 / 0 |
