alter column 可以为一列指定一个新的缺省值或删除老的缺省值。如果老的缺省值被移除且列可以被设为 null,新的缺省值将是 null。如果该列不允许有 null值,mysql 以章节 6.5.3 create table 句法 中的描述方式为该列赋于一个缺省值。
drop index 移除一个索引。这是 mysql 对 ansi sql92 的一个扩展。查看章节 6.5.8 drop index 句法。
drop table 代替。
drop primary key 移除主索引。如果这样的索引不存在,它将移除表中的第一个 unique 索引。(如果没有 primary key 被明确指定,mysql 将第一个 unique 键标记为 primary key )
如果你添加一个 unique index 或 primary key 到一个表中,它将被存储在任何非 unique 索引之前,因而,mysql 可以尽可能地检测出重复键。
order by 允许你以指定的记录行顺序创建一个新表。注意,在插入与删除后,该表将不会保留这个顺序。在某些情况下,如果表在你以后希望排序的列上是有序的,这将使得 mysql 排序时更加得容易。当你知道你主要查询的行以一个确定的次序时,这将是很有用的。在对表进行过大的改变后,通过使用这个选项,你可能会得到更高的性能。
myisam 表上使用 alter table ,所有非唯一的索引将以一个分批方式创建(就像 repair 一样)。当你有很多索引时,这可能使 alter table 更快一点。
alter table ... disable keys 使 mysql 停止更新 myisam 表的非唯一索引。然后 alter table ... enable keys 可以被用来重建丢失的索引。因为 mysql 以特殊的算法执行它,这将比一个接一个地插入索引要快得多,禁用键可以很大程序上的加速一个大批量的插入。
mysql_info(),你可以找出有多少记录被拷贝,以及(当 ignore 被使用时)有多少记录因唯一键值重复而被删除。
foreign key、check 和 references 子句实际上不做任何事情,除了对于 innodb 类型的表,它支持 add constraint foreign key (...) references ... (...)。
注意,innodb 不允许一个 index_name 被指定。查看章节 7.5 innodb 表。
对于其它类型的表,这个句法仅仅为了兼容而提供,以更容易地从其它 sql 服务器移植代码和更容易地运行以引用创建表的应用程序。查看章节 1.8.4 mysql 与 ansi sql92 相比不同的差别。
这里是一个例子,显示了 alter table 的一些用法。我们以一个按如下方式创建一个表 t1 开始:
mysql> create table t1 (a integer,b char(10));
为了将表 t1 重命名为 t2:
mysql> alter table t1 rename t2;
为了将列 a 从 integer 改变为 tinyint not null(列名不变),并将列 b 从 char(10) 改变为 char(20) ,同时也将 b 重命名为 c:
mysql> alter table t2 modify a tinyint not null, change b c char(20);
添加一个名为 d 的 timestamp c列:
mysql> alter table t2 add d timestamp;
在列 d 上增加一个索引,将列 a 设为主键:
mysql> alter table t2 add index (d), add primary key (a);
移除列 c:
mysql> alter table t2 drop column c;
添加一个名为 c 的 auto_increment 整型列:
mysql> alter table t2 add c int unsigned not null auto_increment,
add index (c);
注意,我们索引了 c,因为 auto_increment 列必须被索引,同样我们声明列 c 为 not null,因为被索引的列不能有 null。
当你添加一个 auto_increment 列时,列值会自动地以序列值填充。通过在 alter table 或使用 auto_increment = # 表选项之前执行 set insert_id=# ,你可以设置第一个序列数字。查看章节 5.5.6 set 句法。
对于 myisam 表,如果你不改变 auto_increment 列,序列值将不会被影响。如果你移除一个auto_increment 列,并添加另一个 auto_increment 列,值将再次从 1 开始。
查看章节 a.6.1 alter table 的问题。
6.5.5 rename table 句法
rename table tbl_name to new_tbl_name[, tbl_name2 to new_tbl_name2,...]
更名是以原子方式(atomically)执行,这就意味着,当更名正在运行时,其它的任何线程均不能该表。这使得以一个空表替换一个表成为可能。
create table new_table (...); rename table old_table to backup_table, new_table to old_table;
改名是从左到右执行的,这就意味着,如果你希望交换两个表名,你不得不这样做: