100万行を超えるテーブルで、列のデータ型をDATETIMEからTIMESTAMPに変換したいと考えています。
出来ますか?遅いですか?古い情報は失われますか、それともMySQLはこれを自動的に変換できますか?単にテーブルを変更することはできますか、それとも別のことを実行できますか?
これがテストスクリプトです。
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
これがその実行です(WindowsのMySQL 5.5.12-logを使用)。
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>
うまくいくようです。この小さなサンプルが信頼できない場合は、テーブルのコピーを作成し、コピーを使用してこれを実行します。
試してみる !!!