正如manual page中所述,ALTER TABLE
要求定义所有新的类型属性。
但是,有一种方法可以解决这个问题。您可以使用INFORMATION_SCHEMA
meta-data重新构建所需的ALTER
查询。例如,如果我们有简单的表:
mysql> DESCRIBE t;
+-------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------------+------+-----+---------+----------------+
| id | int(11) unsigned | NO | PRI | NULL | auto_increment |
| value | varchar(255) | NO | | NULL | |
+-------+------------------+------+-----+---------+----------------+
2 rows in set (0.01 sec)
那么我们可以复制我们的ALTER语句:
SELECT
CONCAT(
COLUMN_NAME,
' @new_type',
IF(IS_NULLABLE='NO', ' NOT NULL ', ' '),
EXTRA
) AS s
FROM
INFORMATION_SCHEMA.COLUMNS
WHERE
TABLE_SCHEMA='test'
AND
TABLE_NAME='t'
的结果将是:
+--------------------------------------+
| s |
+--------------------------------------+
| id @new_type NOT NULL auto_increment |
| value @new_type NOT NULL |
+--------------------------------------+
在这里,我已经离开了@new_type
以表明我们可以使用变量(甚至可以直接替换我们的新类型来查询)。变量为:
设置我们的变量。
mysql> SET @new_type := 'VARCHAR(10)', @column_name := 'value';
Query OK, 0 rows affected (0.00 sec)
准备变量prepared statement(这是很长的查询,但我已经离开上述说明):
SET @sql = (SELECT CONCAT('ALTER TABLE t CHANGE `',COLUMN_NAME, '` `', COLUMN_NAME, '` ', @new_type, IF(IS_NULLABLE='NO', ' NOT NULL ', ' '), EXTRA) AS s FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA='test' AND TABLE_NAME='t' AND [email protected]_name);
准备声明:
mysql> prepare stmt from @sql;
Query OK, 0 rows affected (0.00 sec)
Statement prepared
最后,执行它:
mysql> execute stmt;
Query OK, 0 rows affected (0.22 sec)
Records: 0 Duplicates: 0 Warnings: 0
然后,我们会得到我们的数据类型更改为VARCHAR(10)
拯救所有的休息符:
mysql> DESCRIBE t;
+-------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------------+------+-----+---------+----------------+
| id | int(11) unsigned | NO | PRI | NULL | auto_increment |
| value | varchar(10) | NO | | NULL | |
+-------+------------------+------+-----+---------+----------------+
2 rows in set (0.00 sec)
我得到了[修改要求(http://dev.mysql.com/doc/refman /5.1/en/alter-table.html)所有_column_definition_,我认为它可能有另一种语法来改变你想要的。 –