如果你使用 myisampack 压缩一个表,其它的某些列类型可能会发生改变。查看章节 7.1.2.3 压缩表的特征。
6.5.4 alter table 句法
alter [ignore] table tbl_name alter_spec [, alter_spec ...]
alter_specification:
add [column] create_definition [first | after column_name ]
or add [column] (create_definition, create_definition,...)
or add index [index_name] (index_col_name,...)
or add primary key (index_col_name,...)
or add unique [index_name] (index_col_name,...)
or add fulltext [index_name] (index_col_name,...)
or add [constraint symbol] foreign key [index_name] (index_col_name,...)
[reference_definition]
or alter [column] col_name {set default literal | drop default}
or change [column] old_col_name create_definition
[first | after column_name]
or modify [column] create_definition [first | after column_name]
or drop [column] col_name
or drop primary key
or drop index index_name
or disable keys
or enable keys
or rename [to] new_tbl_name
or order by col
or table_options
alter table 允许你改变一个现有表的结构。例如,你可以添加或删除列,创建或撤销索引,更改现有列的类型或将列或表自身更名。你也可以改变表的注释和表的类型。查看章节 6.5.3 create table 句法。
如果你使用 alter table 来改变一个列规约,但是 describe tbl_name 显示你的列并没有被修改,这有可能是因为章节 6.5.3.1 隐式的列定义变化 描述的一个原因,使 mysql 忽略了你的修改。例如,如果你尝试将一个 varchar 列更改为 char,而如果在这个表中包含其它的变长列,mysql 将仍然使用 varchar。
alter table 通过建立原初表的一个临时副本来工作。更改在副本上执行,然后原初表将被删除,临时表被换名。这样做使所有的修改自动地转向到没有任何更新失败的新表。当 alter table 执行时,原初表可被其它客户端读取。更新与写入被延迟到新的表准备好。
注意,如果你以除 rename 之外的其它选项使用 alter table ,mysql 将总是创建一个临时表,即使数据并不确实需要被复制(就像当你改变一个列名时)。我们计划不久来修正它,但是通常人们是不经常执行 alter table的,所以在我们的 todo 上,这个修正并不是急于处理的。对于 myisam 表,你可以将变量 myisam_sort_buffer_size 设置和高一点,以加速索引的重建部分(这是重建进程中最慢的部分)。
-
为了使用
alter table,你需要在这个表上有alter、insert和create权限。 -
ignore是 mysql 对 ansi sql92 的扩展。它用于控制当在新表中的唯一键上出现重复值时,alter table如何工作。如果ignore没有被指定,副本将被放弃并回退。如果ignore被指定,那么在唯一键上重复的记录行只有第一个记录行被使用;其它的均被删除。 -
你可以在单个的
alter table语句中发出多个add、alter、drop和change子句。这是 mysql 对 ansi sql92 的扩展,ansi sql92 只允许在每个alter table语句中一个子句。 -
change col_name、drop col_name和drop index是 mysql 对 ansi sql92 的扩展。 -
modifyis an oracle extension toalter table. -
可选词
column只是一个无用词组,可被忽略。 -
如果你使用
alter table tbl_name rename to new_name,并没有任何其它的选项,mysql 将简单地重命名与表tbl_name的文件。这不需要创建临时表。查看章节 6.5.5rename table句法。 -
create_definition子句使用与create table相同的add和change句法。注意,这些句法不仅包含列类型,还要包含列名。查看章节 6.5.3create table句法。 -
你可以使用一个
change old_col_name create_definition子句来重命名一个列。为了这样做,你必须指定旧的和新的列名,以及列当前的类型。例如,为了将一个integer列a重命名为b,你必须这样做:mysql> alter table t1 change a b integer;
如果你希望改变一个列的类型而不是列名,change句法仍然需要有两个列名,即使它们是一样的。例如:mysql> alter table t1 change b b bigint not null;
然后,到 mysql 3.22.16a 时,你也可以使用modify来改变一个列的类型而不需要重命名它:mysql> alter table t1 modify b bigint not null;
-
如果你使用
change或modify缩短一个列,而该列上存在一个取列部分值的索引(举例来说,如果你有一个索引在一个varchar列的前 10 个字符上),那么,你将不能使列短于索引的字符数目。 -
当你使用
change或modify改变一个列类型时,mysql 将尝试尽可能地将数据转换到新的类型。 -
在 mysql 3.22 或更新的版本中,你可以使用
first或add ... after col_name在一个表中的某个特定位置添加一列。缺省是增加到最后一列。从 mysql 4.0.1 开始,你也可以在change或modify中使用关键词first和after。