MySQL 4.1.0 中文参考手册 --- 6.5 数据定义: CREATE、DROP、ALTER[6]

[入库:2005年8月18日] [更新:2007年3月24日]

本文简介:选择自 shuixin13 的 blog

如果你使用 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,你需要在这个表上有 alterinsertcreate 权限。

  • ignore 是 mysql 对 ansi sql92 的扩展。它用于控制当在新表中的唯一键上出现重复值时,alter table 如何工作。如果 ignore 没有被指定,副本将被放弃并回退。如果 ignore 被指定,那么在唯一键上重复的记录行只有第一个记录行被使用;其它的均被删除。

  • 你可以在单个的 alter table 语句中发出多个 addalterdropchange 子句。这是 mysql 对 ansi sql92 的扩展,ansi sql92 只允许在每个 alter table 语句中一个子句。

  • change col_namedrop col_namedrop index 是 mysql 对 ansi sql92 的扩展。

  • modify is an oracle extension to alter table.
  • 可选词 column 只是一个无用词组,可被忽略。

  • 如果你使用 alter table tbl_name rename to new_name,并没有任何其它的选项,mysql 将简单地重命名与表 tbl_name 的文件。这不需要创建临时表。查看章节 6.5.5 rename table 句法

  • create_definition 子句使用与 create table 相同的 addchange 句法。注意,这些句法不仅包含列类型,还要包含列名。查看章节 6.5.3 create table 句法

  • 你可以使用一个 change old_col_name create_definition 子句来重命名一个列。为了这样做,你必须指定旧的和新的列名,以及列当前的类型。例如,为了将一个 integera 重命名为 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;
    
  • 如果你使用 changemodify 缩短一个列,而该列上存在一个取列部分值的索引(举例来说,如果你有一个索引在一个 varchar 列的前 10 个字符上),那么,你将不能使列短于索引的字符数目。

  • 当你使用 changemodify 改变一个列类型时,mysql 将尝试尽可能地将数据转换到新的类型。

  • 在 mysql 3.22 或更新的版本中,你可以使用 firstadd ... after col_name 在一个表中的某个特定位置添加一列。缺省是增加到最后一列。从 mysql 4.0.1 开始,你也可以在 changemodify 中使用关键词 firstafter

本文关键:MySQL 4.1.0 中文
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top