Fel*_*ipe 7 mysql timestamp datetime
我想在超过一百万行的表中将列数据类型从 DATETIME 转换为 TIMESTAMP。
是否可以?慢吗?我会丢失旧信息还是 MySQL 可以自动转换?我可以做一个alter table还是我可以做一些不同的事情?
这是一个测试脚本:
use test
drop table if exists felipe_table;
create table felipe_table
(
id int not null auto_increment,
dt datetime not null,
name varchar(25),
primary key (id)
);
insert into felipe_table (dt,name) values
(NOW() + INTERVAL FLOOR(RAND()*10) DAY,'rolando'),
(NOW() + INTERVAL FLOOR(RAND()*100) DAY,'pamela'),
(NOW() + INTERVAL FLOOR(RAND()*1000) DAY,'dominique'),
(NOW() + INTERVAL FLOOR(RAND()*10000) DAY,'diamond');
select * from felipe_table;
SHOW CREATE TABLE felipe_table\G
ALTER TABLE felipe_table MODIFY dt TIMESTAMP;
select * from felipe_table;
SHOW CREATE TABLE felipe_table\G
Run Code Online (Sandbox Code Playgroud)
这是它的执行(使用 MySQL 5.5.12-log for Windows):
mysql> use test
Database changed
mysql> drop table if exists felipe_table;
Query OK, 0 rows affected (0.03 sec)
mysql> create table felipe_table
-> (
-> id int not null auto_increment,
-> dt datetime not null,
-> name varchar(25),
-> primary key (id)
-> );
Query OK, 0 rows affected (0.11 sec)
mysql> insert into felipe_table (dt,name) values
-> (NOW() + INTERVAL FLOOR(RAND()*10) DAY,'rolando'),
-> (NOW() + INTERVAL FLOOR(RAND()*100) DAY,'pamela'),
-> (NOW() + INTERVAL FLOOR(RAND()*1000) DAY,'dominique'),
-> (NOW() + INTERVAL FLOOR(RAND()*10000) DAY,'diamond');
Query OK, 4 rows affected (0.13 sec)
Records: 4 Duplicates: 0 Warnings: 0
mysql> select * from felipe_table;
+----+---------------------+-----------+
| id | dt | name |
+----+---------------------+-----------+
| 1 | 2013-02-16 09:01:21 | rolando |
| 2 | 2013-02-09 09:01:21 | pamela |
| 3 | 2014-09-07 09:01:21 | dominique |
| 4 | 2036-03-07 09:01:21 | diamond |
+----+---------------------+-----------+
4 rows in set (0.00 sec)
mysql> SHOW CREATE TABLE felipe_table\G
*************************** 1. row ***************************
Table: felipe_table
Create Table: CREATE TABLE `felipe_table` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`dt` datetime NOT NULL,
`name` varchar(25) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=latin1
1 row in set (0.00 sec)
mysql> ALTER TABLE felipe_table MODIFY dt TIMESTAMP;
Query OK, 4 rows affected (0.31 sec)
Records: 4 Duplicates: 0 Warnings: 0
mysql> select * from felipe_table;
+----+---------------------+-----------+
| id | dt | name |
+----+---------------------+-----------+
| 1 | 2013-02-16 09:01:21 | rolando |
| 2 | 2013-02-09 09:01:21 | pamela |
| 3 | 2014-09-07 09:01:21 | dominique |
| 4 | 2036-03-07 09:01:21 | diamond |
+----+---------------------+-----------+
4 rows in set (0.00 sec)
mysql> SHOW CREATE TABLE felipe_table\G
*************************** 1. row ***************************
Table: felipe_table
Create Table: CREATE TABLE `felipe_table` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`dt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`name` varchar(25) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=latin1
1 row in set (0.00 sec)
mysql>
Run Code Online (Sandbox Code Playgroud)
看起来它有效。如果您不信任这个小样本,请制作该表的副本并使用副本执行此操作。
试一试 !!!
归档时间: |
|
查看次数: |
10558 次 |
最近记录: |