Подтвердить что ты не робот

Преобразование столбца mysql из INT в TIMESTAMP

Когда я был yound и stupid имел мало опыта, я решил, что было бы хорошей идеей, генерировать временные метки в PHP и хранить их в столбце INT в моей таблице innodb MySQL. Теперь, когда эта таблица содержит миллионы записей и нуждается в некоторых запросах на основе даты, пришло время преобразовать этот столбец в TIMESTAMP. Как это сделать?

Currenlty, моя таблица выглядит так:

id (INT) | message (TEXT) | date_sent (INT)
---------------------------------------------
1        | hello?         | 1328287526
2        | how are you?   | 1328287456
3        | shut up        | 1328234234
4        | ok             | 1328678978
5        | are you...     | 1328345324

Вот запросы, которые я придумал, чтобы преобразовать столбец date_sent в TIMESTAMP:

-- creating new column of TIMESTAMP type
ALTER TABLE `pm`
  ADD COLUMN `date_sent2` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP();

-- assigning value from old INT column to it, in hope that it will be recognized as timestamp
UPDATE `pm` SET `date_sent2` = `date_sent`;

-- dropping the old INT column
ALTER TABLE `pm` DROP COLUMN `date_sent`;

-- changing the name of the column
ALTER TABLE `pm` CHANGE `date_sent2` `date_sent` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP();

Все кажется мне правильным, но когда приходит время UPDATE pm SET date_sent2 = date_sent ;, я получаю предупреждение, а значение временной метки остается пустым:

+---------+------+--------------------------------------------------+
| Level   | Code | Message                                          |
+---------+------+--------------------------------------------------+
| Warning | 1265 | Data truncated for column 'date_sent2' at row 1  |

Что я делаю неправильно, и есть ли способ исправить это?

4b9b3361

Ответ 1

Вы почти там, используйте FROM_UNIXTIME() вместо прямого копирования значения.

-- creating new column of TIMESTAMP type
ALTER TABLE `pm`
  ADD COLUMN `date_sent2` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP();

-- Use FROM_UNIXTIME() to convert from the INT timestamp to a proper datetime type
-- assigning value from old INT column to it, in hope that it will be recognized as timestamp
UPDATE `pm` SET `date_sent2` = FROM_UNIXTIME(`date_sent`);

-- dropping the old INT column
ALTER TABLE `pm` DROP COLUMN `date_sent`;

-- changing the name of the column
ALTER TABLE `pm` CHANGE `date_sent2` `date_sent` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP();