2012-02-03 48 views
10

Khi tôi là yound và ngu ngốc có ít kinh nghiệm, tôi đã quyết định sẽ tạo ra dấu thời gian trong PHP và lưu trữ chúng trong cột INT trong bảng innodb MySQL của tôi. Bây giờ, khi bảng này có hàng triệu bản ghi và cần một số truy vấn dựa trên ngày, đã đến lúc chuyển đổi cột này thành TIMESTAMP. Làm thế nào để tôi làm điều này?Chuyển đổi cột mysql từ INT thành TIMESTAMP

Currenlty, bàn của tôi trông như thế này:

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 

Dưới đây là các truy vấn tôi đã đưa ra, để chuyển đổi date_sent cột để 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(); 

Mọi thứ dường như đúng với tôi, nhưng khi thời gian đến cho UPDATE pm SET date_sent2 = date_sent ;, tôi nhận được một giá trị cảnh báo và dấu thời gian vẫn trống:

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

Tôi đang làm gì sai và có cách nào sửa lỗi này không?

Trả lời

28

Bạn đang ở gần đó, sử dụng FROM_UNIXTIME() thay vì trực tiếp sao chép giá trị.

-- 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(); 
+0

Cảm ơn bạn. Hoạt động hoàn hảo! –

Các vấn đề liên quan