您好,欢迎访问三七文档
13.1.1.ALTERDATABASE语法ALTER{DATABASE|SCHEMA}[db_name]alter_specification[,alter_specification]...alter_specification:[DEFAULT]CHARACTERSETcharset_name|[DEFAULT]COLLATEcollation_nameALTERDATABASE用于更改数据库的全局特性。这些特性储存在数据库目录中的db.opt文件中。要使用ALTERDATABASE,您需要获得数据库ALTER权限。CHARACTERSET子句用于更改默认的数据库字符集。COLLATE子句用于更改默认的数据库整序。在第10章:字符集支持中对字符集和整序名称进行了讨论。数据库名称可以忽略,此时,语句对应于默认数据库。也可以使用ALTERSCHEMA。13.1.2.ALTERTABLE语法ALTER[IGNORE]TABLEtbl_namealter_specification[,alter_specification]...alter_specification:ADD[COLUMN]column_definition[FIRST|AFTERcol_name]|ADD[COLUMN](column_definition,...)|ADDINDEX[index_name][index_type](index_col_name,...)|ADD[CONSTRAINT[symbol]]PRIMARYKEY[index_type](index_col_name,...)|ADD[CONSTRAINT[symbol]]UNIQUE[index_name][index_type](index_col_name,...)|ADD[FULLTEXT|SPATIAL][index_name](index_col_name,...)|ADD[CONSTRAINT[symbol]]FOREIGNKEY[index_name](index_col_name,...)[reference_definition]|ALTER[COLUMN]col_name{SETDEFAULTliteral|DROPDEFAULT}|CHANGE[COLUMN]old_col_namecolumn_definition[FIRST|AFTERcol_name]|MODIFY[COLUMN]column_definition[FIRST|AFTERcol_name]|DROP[COLUMN]col_name|DROPPRIMARYKEY|DROPINDEXindex_name|DROPFOREIGNKEYfk_symbol|DISABLEKEYS|ENABLEKEYS|RENAME[TO]new_tbl_name|ORDERBYcol_name|CONVERTTOCHARACTERSETcharset_name[COLLATEcollation_name]|[DEFAULT]CHARACTERSETcharset_name[COLLATEcollation_name]|DISCARDTABLESPACE|IMPORTTABLESPACE|table_options|partition_options|ADDPARTITIONpartition_definition|DROPPARTITIONpartition_names|COALESCEPARTITIONnumber|REORGANIZEPARTITIONpartition_namesINTO(partition_definitions)|ANALYZEPARTITIONpartition_names|CHECKPARTITIONpartition_names|OPTIMIZEPARTITIONpartition_names|REBUILDPARTITIONpartition_names|REPAIRPARTITIONpartition_namesALTERTABLE用于更改原有表的结构。例如,您可以增加或删减列,创建或取消索引,更改原有列的类型,或重新命名列或表。您还可以更改表的评注和表的类型。允许进行的变更中,许多子句的语法与CREATETABLE中的子句的语法相近。其中包括table_options修改,选项有ENGINE,AUTO_INCREMENT和AVG_ROW_LENGTH等。请见13.1.5节,“CREATETABLE语法”。存储引擎不支持有些操作,如果进行这些操作,会出现警告。使用SHOWWARNINGS可以显示出这些警告。请参见13.5.4.22节,“SHOWWARNINGS语法”。如果您使用ALTERTABLE更改列规约,但是DESCRIBEtbl_name提示您列规约并没有改变,则可能是因为MySQL忽略了您所做的更改。忽略更改的原因见13.1.5.1节,“沉寂的列规格变更”。例如,如果您试图把VARCHAR列更改为CHAR列,此时,如果表包含其它长度可变的列,则MySQL仍会使用VARCHAR。ALTERTABLE运行时会对原表进行临时复制,在副本上进行更改,然后删除原表,再对新表进行重命名。在执行ALTERTABLE时,其它用户可以阅读原表,但是对表的更新和修改的操作将被延迟,直到新表生成为止。新表生成后,这些更新和修改信息会自动转移到新表上。注意,如果您在执行ALTERTABLE时使用除了RENAME以外的选项,则MySQL会创建一个临时表。即使数据并不需要进行复制(例如当您更改列的名称时),MySQL也会这么操作。对于MyISAM表,您可以通过把myisam_sort_buffer_size系统变量设置到一个较高的值,来加快重新创建索引(该操作是变更过程中速度最慢的一部分)的速度。·要使用ALTERTABLE,您需要获得表的ALTER,INSERT和CREATE权限。·IGNORE是MySQL相对于标准SQL的扩展。如果在新表中有重复关键字,或者当STRICT模式启动后出现警告,则使用IGNORE控制ALTERTABLE的运行。如果没有指定IGNORE,当重复关键字错误发生时,复制操作被放弃,返回前一步骤。如果指定了IGNORE,则对于有重复关键字的行,只使用第一行,其它有冲突的行被删除。并且,对错误值进行修正,使之尽量接近正确值。·您可以在一个ALTERTABLE语句里写入多个ADD,ALTER,DROP和CHANGE子句,中间用逗号分开。这是MySQL相对于标准SQL的扩展。在标准SQL中,每个ALTERTABLE语句中每个子句只允许使用一次。例如,在一个语句中取消多个列:·mysqlALTERTABLEt2DROPCOLUMNc,DROPCOLUMNd;·CHANGEcol_name,DROPcol_name和DROPINDEX是MySQL相对于标准SQL的扩展。·MODIFY是Oracle对ALTERTABLE的扩展。·COLUMN只是自选项目,可以忽略。·如果您使用ALTERTABLEtbl_nameRENAMETOnew_tbl_name并且没有其它选项,则MySQL只对与tabletbl_name相对应的文件进行重命名。不需要创建一个临时表。(您也可以使用RENAMETABLE语句对表进行重命名。请参见13.1.9节,“RENAMETABLE语法”。)·column_definition子句使用与CREATETABLE中的ADD和CHANGE子句相同的语法。注意,此语法包括列名称,而不只是列类型。请参见13.1.5节,“CREATETABLE语法”。·您可以使用CHANGEold_col_namecolumn_definition子句对列进行重命名。重命名时,需给定旧的和新的列名称和列当前的类型。例如:要把一个INTEGER列的名称从a变更到b,您需要如下操作:·mysqlALTERTABLEt1CHANGEabINTEGER;如果您想要更改列的类型而不是名称,CHANGE语法仍然要求旧的和新的列名称,即使旧的和新的列名称是一样的。例如:mysqlALTERTABLEt1CHANGEbbBIGINTNOTNULL;您也可以使用MODIFY来改变列的类型,此时不需要重命名:mysqlALTERTABLEt1MODIFYbBIGINTNOTNULL;·如果您使用CHANGE或MODITY缩短列长时,列中存在有索引,并且缩短后的列长小于索引长度,则MySQL会自动缩短索引的长度。·当您使用CHANGE或MODIFY更改列的类型时,MySQL会尽量把原有的列值转化为新的类型。·您可以使用FIRST或AFTERcol_name在一个表行中的某个特定位置添加列。默认把列添加到最后。您也可以在CHANGE或MODIFY语句中使用FIRST和AFTER。·AFTERCOLUMN用于指定列的新默认值,或删除旧的默认值。如果旧的默认值被删除同时列值为NULL,则新的默认值为NULL。如果列值不能为NULL,MySQL会指定一个默认值,请参见13.1.5节,“CREATETABLE语法”。·DROPINDEX用于取消索引。这是MySQL相对于标准SQL的扩展。请参见13.1.7节,“DROPINDEX语法”。·如果列从表中被取消了,则这些列也从相应的索引中被取消。如果组成一个索引的所有列均被取消,则该索引也被取消。·如果一个表只包含一列,则此列不能被取消。如果您想要取消表,应使用DROPTABLE。·DROPPRIMAYDEY用于取消主索引。注释:在MySQL较早的版本中,如果没有主索引,则DROPPRIMARYKEY会取消表中的第一个UNIQUE索引。在MySQL5.1中不会出现这种情况。如果在MySQL5.1中对没有主键的表使用DROPPRIMARYKEY,则会出现错误信息。如果您向表中添加UNIQUEKEY或PRIMARYKEY,则UNIQUEKEY或PRIMARYKEY会被储存在非唯一索引之前,这样MySQL就可以尽早地检查出重复关键字。·ORDERBY用于在创建新表时,让各行按一定的顺序排列。注意,在插入和删除后,表不会仍保持此顺序。当您知道多数情况下您会按照特定的顺序查询各行时,可以使用这个选项;在对表进行了大的改动后,通过使用此选项,您可以提高查询效率。在有些情况下,如果表按列排序,对于MySQL来说,排序可能会更简单。·如果您对一个MyISAM表使用ALTERTABLE,则所有非唯一索引会被创建到一个单独的批里(和REPAIRTABLE相同)。当您有许多索引时,这样做可以使ALTERTABLE的速度更快。这项功能可以明确激活。ALTERTABLE...DISABLEKEYS让MySQL停止更新MyISAM表中的非唯一索引。然后使用ALTERTABLE...ENABLEKEYS重新创建丢失的索引。进行此操作时,MySQL采用一种特殊的算法,比一个接一个地插入关键字要快很多。因此,在进行成批插入操作前先使关键字禁用可以大大地加快速度。使用ALTERTABLE...DISABLEKEYS除了需要获得以前提到的权限以外,还需要获得INDEX权限。·Innodb存储引擎支持FOREIGNKEY和REFERENCES子句。Innodb存储引擎执行ADD[CONSTRAINT[symbol]]FOREIGNKEY(...)REFERENCES...(...)。请参见15.2.6.4节,“FOREIGNKEY约束”。对于其它存储引擎,这些子句会被分析,但是会被忽略。对于所有的存储引擎,CHECK子句会被分析,但是会被忽略。请参见13.1.5节,“CREATETABLE语法”。接受这些子句但又忽略子句的原因是为了提高兼容性,以便更容易地从其它SQL服务器中导入代码,并运行应用程序,创建带参考数据的表。请参见1.8.5节,“MySQL与标准SQL的差别”。·InnoDB支
本文标题:MYSQL语句语法
链接地址:https://www.777doc.com/doc-4963375 .html