Оператор обновления MySQL, вызывающий побочные эффекты - PullRequest
0 голосов
/ 20 августа 2011

У меня есть таблица MySQL в формате, показанном ниже:

mysql> select event_time, count, result, pcm_id from Events_CallMeBack_2011_08_05 WHERE pcm_id=1566;
+---------------------+-------+--------+--------+
| event_time          | count | result | pcm_id |
+---------------------+-------+--------+--------+
| 2011-08-05 23:45:04 |     0 | NULL   |   1566 |
+---------------------+-------+--------+--------+
1 row in set (0.00 sec)

Проблема в том, что когда я запускаю запрос UPDATE, модифицирующий столбец результата, событие-время также обновляется как побочный эффект.Я понятия не имею, почему это происходит: я, конечно, не хочу, чтобы поле event_time обновлялось при попытке обновить столбец результата.

Вот запрос:

UPDATE Events_CallMeBack_2011_08_05 SET result ='D' WHERE pcm_id = '1566'

Вотрезультирующий столбец после выполнения инструкции UPDATE.

mysql> select event_time, count, result, pcm_id from Events_CallMeBack_2011_08_05 WHERE pcm_id=1566;
+---------------------+-------+--------+--------+
| event_time          | count | result | pcm_id |
+---------------------+-------+--------+--------+
| 2011-08-20 19:40:21 |     0 | D      |   1566 |
+---------------------+-------+--------+--------+
1 row in set (0.00 sec)

Столбец event_time был обновлен до текущего локального времени сервера mysql.

Мой первоначальный анализ состоит в том, что mysql автоматически обновляет event_time (TIMESTAMP) столбец в операторах обновления.Оператор CREATE TABLE не определяет это, поэтому я не знаю, почему это происходит.

Создать оператор:

strSql = "CREATE TABLE " + strTableName +
"(id INT NOT NULL, event_time TIMESTAMP,....

Таблица описана ниже.

mysql> describe Events_CallMeBack_2011_08_05;


+------------+-------------+------+-----+-------------------+-----------------------------+
| Field      | Type        | Null | Key | Default           | Extra                       |
   +------------+-------------+------+-----+-------------------+-----------------------------+
| id         | int(11)     | NO   |     | NULL                  |                             |
| event_time | timestamp   | NO   |     | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
| event_code | varchar(30) | YES  |     | NULL                         |                             |
| count      | int(11)     | YES  |     | 0                 |                             |
| result     | varchar(1)  | YES  |     | NULL              |                             |
| pcm_id     | int(11)     | NO   | PRI | NULL              | auto_increment              |
 +------------+-------------+------+-----+-------------------+-----------------------------+

Ответы [ 2 ]

1 голос
/ 20 августа 2011

Да, это задокументированное поведение типа данных TIMESTAMP. Он обновляется до текущего времени каждый раз, когда вы обновляете строку.

Без предложений DEFAULT и ON UPDATE это то же самое, что и DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP.

Если вы определили свой столбец TIMESTAMP с постоянным значением по умолчанию (например, 0), вы можете переопределить это поведение. Прочитайте страницу руководства для более подробной информации.

1 голос
/ 20 августа 2011

Столбец event_time, вероятно, объявлен с типом TIMESTAMP. Столбцы этого типа устанавливаются на текущее время, когда строка вставляется или обновляется.

Попробуйте вместо этого использовать DATETIME.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...