10bet网址
MySQL 5.6リファレンスマニュアル
本手册下载
PDF (Ltr)- 26.8 mb
PDF (A4)- 26.8 mb


13.1.7 alter table構文

修改[online | offline] [ignore]表tbl_namealter_specification(,alter_specification)……] [partition_optionsalter_specificationtable_options|添加(列)col_namecolumn_definition(第一个|col_name|添加[列](col_namecolumn_definition| add{索引|键}[index_name] [index_type)(index_col_name,……)index_option)……| add [constraint]象征主键[index_type)(index_col_name,……)index_option)……| add [constraint]象征[索引|键][index_name] [index_type)(index_col_name,……)index_option)……|添加全文[索引|键][index_name)(index_col_name,……)index_option)……| add spatial[索引|键][index_name)(index_col_name,……)index_option)……| add [constraint]象征]]外键[index_name)(index_col_name,……)reference_definition| algorithm [=] {default | inplace | copy} | alter [column]col_name{设置默认文字| drop default}old_col_namenew_col_namecolumn_definition(第一个|col_name| lock [=] {default | none | shared | exclusive} | modify [column]col_namecolumn_definition(第一个|col_name| drop[列]col_name删除主键|index_name|删除外键fk_symbol|禁用键|启用键| rename [to | as]new_tbl_name|命令col_name(,col_name)……|转换为字符集charset_name(核对collation_name| [default]字符集[=]charset_name(核对(=)collation_name删除表空间导入表空间partition_definition) |删除分区partition_names截断分区{partition_names| all} |合并分区数量|重组分区partition_names到(partition_definitions) |交换分区partition_name与表tbl_name分析分区partition_names| all} |检查分区{partition_names|优化分区{partition_names|重建分区{partition_names|修复分区{partition_names|删除分区index_col_namecol_name((长度[asc | desc]index_type:使用{btree | hash}index_option: KEY_BLOCK_SIZE (=)价值|index_type|与解析器parser_name|评论”字符串table_optionstable_option[[,]table_option)……(参见CREATE TABLE选项)partition_options:(参见CREATE TABLE选项)

ALTER TABLEは,テブルの構造を変更します。たとえば,カラムを追加または削除したり、インデックスを作成または破棄したり、既存のカラムの型を変更したり、カラムまたはテーブル自体の名前を変更したりできます。また、テーブルに使用されているストレージエンジンやテーブルのコメントなどの特性を変更することもできます。

テブル名のあとに,行う変更を指定します。何も指定されていない場合,ALTER TABLEは何もしません。

許可される多くの変更の構文は,创建表ステトメントの各句に似ています。詳細は,セクション13.1.17 " create table構文"を参照してください。

table_optionsは,引擎AUTO_INCREMENTAVG_ROW_LENGTHMAX_ROWSROW_FORMATなどの,创建表ステトメントで使用できる種類のテブルオプションを示します。すべてのテブルオプションのリストと各オプションの説明にいては,セクション13.1.17 " create table構文"を参照してください。ただし,ALTER TABLEは,数据目录および索引目录テブルオプションを無視します。

partition_optionsは,再パーティション化,パーティションの追加,削除,マージ,および分割,パーティション化の保守の実行などのために,パーティション化されたテーブルで使用できるオプションを示します。ALTER TABLEステトメントには,ほかの変更指定に加えて,分区的または删除分区句を含めることができますが,分区的または删除分区句は,ほかのどの指定よりもあとの最後に指定する必要があります。添加分区删除分区合并分区重组分区交换分区分析分区检查分区,および修复分区オプションは,個々のパティションに対して機能するため,1ALTER TABLE内でほかの変更指定と組み合わせることはできません。パティションのオプションの詳細は,セクション13.1.17 " create table構文"およびセクション13.1.7.1 " alter tableパティション操作"を参照してください。ALTER TABLE……交换分区ステトメントの詳細および例にいては,セクション19.3.1 " rangeおよびlistパティションの管理"を参照してください。

操作によっては,ストレージエンジンがその操作をサポートしていないテーブルに対して試行されると,警告が生成される場合があります。これらの警告は,显示警告で表示できます。セクション13.7.5.41 " show warnings構文"を参照してください。

ALTER TABLEのトラブルシュティングにいては,セクションb.5.7.1 " alter tableでの問題"を参照してください。

ストレジ,パフォマンス,および並列性に関する考慮事項

ほとんどの場合,ALTER TABLEは元のテブルの一時的なコピを作成します。米ySQL は、そのテーブルを変更しているほかの操作を待ってから、処理を続行します。そのコピーに変更を組み込み、元のテーブルを削除したあと、新しいテーブルの名前を変更します。ALTER TABLEの実行中,ほかのセッションは元のテーブルを読み取ることができます(例外については,すぐあとに説明します)。ALTER TABLE操作の開始後に開始されたテーブルへの更新や書き込みは,新しいテーブルの準備ができるまで停止されてから,どの更新も失敗することなく,新しいテーブルに自動的にリダイレクトされます。元のテブルの一時的なコピは,新しいテスディレクトリ内に作成されます。これは,テブルの名前を別のデタベスに変更したALTER TABLE操作のための元のテブルのデタベスディレクトリとは異なる場合があります。

前に触れた例外とは,ALTER TABLEが,テブルの.frmファイルの新しいバージョンをインストールし,古いファイルを破棄して,テーブルおよびテーブル定義キャッシュから古くなったテーブル構造をクリアする準備ができた時点で(書き込みだけでなく)読み取りをブロックすることです。この時点で,このステトメントは排他的ロックを取得する必要があります。それを行うために,現在の読み取り側が完了するのを待って,新しい読み取り(および書き込み)をブロックします。

MyISAMテブルの場合は,myisam_sort_buffer_sizeシステム変数を大きな値に設定することによって,インデックスの再作成(変更プロセスのもっとも遅い部分)を高速化できます。

一部の操作では,一時テALTER TABLEが可能です。

  • ALTER TABLEtbl_name重命名为new_tbl_nameをほかのオプションなしで実行すると,MySQLは単純に,コピを作成することなく,テブルtbl_nameに対応するすべてのファ邮箱ルの名前を変更します。(重命名表ステトメントを使用してテブルの名前を変更することもできます。セクション13.1.32 " rename table構文"を参照してください)名前変更されたテーブル専用に付与された権限は,どれも新しい名前には移行されません。それらは,手動で変更する必要があります。

  • サバが変更する必要があるのはテブルの内容ではなく,テ.frmファイルだけであるため,テーブルデータを変更せず,テーブルメタデータだけを変更する変更はただちに実行されます。次の変更は,この方法で実行できる迅速な変更です。

    • カラムの名前変更。ただし,米ySQL 5.6.6 より前のInnoDBストレジエンジンを除きます。

    • カラムのデフォルト値の変更(NDBテブルを除きます。「MySQL集群オンラMySQL集群ン操作の制限を参照してください)。

    • 有効なメンバ値のリストの最後に新しい列挙またはセットメンバを追加することによる,枚举またはカラムの定義の変更。ただし,デタ型のストレージサイズが変更される場合を除きます。たとえば、メンバー数が 8 のカラムにメンバーを追加すると,値ごとに必要なストレージが1バイトから2バイトに変更されます。これには,テブルコピが必要になります。リストの途中にメンバを追加すると,既存のメンバの番号が変更されます。これには,テブルコピが必要になります。

  • 添加分区删除分区合并分区重建分区,または重组分区を含むALTER TABLEは,一時テブルを作成しません(NDBテブルで使用される場合を除きます)。ただし,これらの操作では、一時的なパーティションファイルが作成されます。

    范围または列表パティションに対する添加または下降操作は即座の操作か,ほぼ即座の操作です。哈希または关键パティションに対する添加または合并操作では,线性散列または线性关键が使用されていないかぎり,すべてのパティション間でデタがコピされます。添加または合并操作はパティションごとに実行されますが,これは実質的に,新しいテブルの作成と同じです。重组操作では変更されたパティションのみがコピされ,変更されていないものはそのままです。

  • ンデックスの名前変更。InnoDBを除きます。

  • InnoDBNDBに対する邮箱ンデックスの追加または削除。

old_alter_tableシステム変数をに設定するか,またはalter_specification句の1として算法=复制を指定することによって,通常であればテブルコピを必要としないALTER TABLE操作で強制的に(MySQL 5.0でサポートされている)一時テーブルの方法を使用するようにできます。old_alter_table設定と,默认的以外の値を持算法句の間に矛盾がある場合は,算法句が優先されます。(算法=违约は,算法句をまったく指定しないのと同じです。)

算法=原地を指定すると,それをサポートする句やストレージエンジンに対してインプレースの手法が使用されるようになり,サポートされていない場合はエラーで失敗します。そのため,予測していたものとは異なるストレージエンジンを使用するテーブルを変更しようとした場合の非常に長いテーブルコピーが回避されます。InnoDBテブルに対するオンランDDLに,セクション14.11 " InnoDBとオンラereplicationンDDL "を参照してください。

MySQL 5.6.16では,ALTER TABLEは,添加一列改变列修改列添加索引,および操作に関して,古い時間カラムを5.6形式にアップグレドします。テブルを再構築しなければならないため,この変換は原地アルゴリズムを使用して実行することはできません。そのため,これらの場合に算法=原地を指定するとエラになります。必要であれば,算法=复制を指定します。

MySQL 5.6.22から,テブルを关键によってパティション化するために使用されるマルチカラムALTER TABLE操作は、この操作によってカラムの順序が変更される場合はオンラ以及ンで実行できません。このような場合は,代わりに,コピ,するALTER TABLEを使用する必要があります。(Bug #17896265)

MySQL集群はオンラMySQL集群ンALTER TABLE操作もサポトしていますが,算法=原地構文を受け入れないため,代わりに在线キワドが使用されます。在线および离线キワドは,MySQL集群でのみサポトされます。これらのキワドは,MySQL集群NDB 7.3から非推奨です。米ySQL Cluster NDB 7.4 では引き続きサポートされますが、将来のバージョンの MySQL Cluster で削除される可能性があります。正確な構文およびその他の詳細については、セクション13.1.7.2“MySQL集群でのALTER TABLEオンライン操作“を参照してください。

句を使用すると,変更中のテブルの並列読み取りおよび書き込みのレベルを制御できます。この句にデフォルト以外の値を指定すると,変更操作中に特定の量の並列アクセスまたは排他性が要求されるようにすることが可能であり,要求されたレベルのロックを使用できない場合は操作が停止されます。句のパラメタは次のとおりです。

  • 锁=违约

    指定された算法句(存在する場合)およびALTER TABLE操作に対する最大レベルの並列性:サポートされている場合は,並列読み取りおよび書き込みを許可します。そうでない場合,サポ,トされている場合は,並列読み取りを許可します。そうでない場合は,排他的アクセスを適用します。

  • 锁=没有

    サポトされている場合は,並列読み取りおよび書き込みを許可します。そうでない場合は,エラメッセジを返します。

  • 锁=共享

    サポトされている場合は,並列読み取りを許可しますが,書き込みはブロックします。書き込みは,指定された算法句(存在する場合)およびALTER TABLE操作に対して,並列書き込みがストレジエンジンによってサポトされている場合でもブロックされます。並列読み取りがサポトされていない場合は,エラジを返します。

  • 锁=独家

    排他的アクセスを適用します。これは,指定された算法句(存在する場合)およびALTER TABLE操作に対して,並列読み取り/書き込みがストレージエンジンによってサポートされている場合でも実行されます。

MySQL 5.6.3の時点では,ALTER TABLEtbl_nameを使用して,テブルを再構築する変更操作を実行することもできます。以前は,オプションは認識されましたが,無視されました。MySQL 5.6.17の時点では,オンラ帐号帐号ンDDLのサポトはオプションに対して提供されます。詳細は,セクション14.11.1 "オンラereplicationンDDLの概要"を参照してください。

NDBテーブルの場合,可変幅カラム上のインデックスを追加および削除する操作は,そのほとんどの期間,テーブルコピーを行なったり,並列DMLアクションをブロックしたりすることなくオンラインで実行されます。セクション13.1.7.2“MySQL集群でのALTER TABLEオンライン操作“を参照してください。

使用上の注意

  • ALTER TABLEを使用するには,このテブルに対する改变创建,および插入権限が必要です。テブルを名前変更するには、古いテーブル側で改变および下降と,新しいテブル側で改变创建,および插入権限が必要です。

  • 忽略は,標準SQLへのMySQL拡張です。これは,新しいテーブル内の一意のキーに関して重複が存在する場合や、厳密モードが有効になっているときに警告が発生した場合のALTER TABLEの動作を制御します。忽略が指定されていない場合は,重複キエラが発生すると,コピは中止され,ロルバックされます。忽略が指定されている場合は,一意のキ1行だけが使用されます。その他の競合している行は削除されます。正しくない値は,もっとも近い一致する許容可能な値に切り捨てられます。

    MySQL 5.6.17の時点では,忽略句は非推奨であり,使用すると警告が生成されます。MySQL 5.7では;忽略は削除されます。

  • テブルが書き込みロックされているときに,そのテブル構造を変更するためにALTER TABLEが使用されると,保留中の插入延迟ステトメントは失われます。

  • table_optionは,引擎AUTO_INCREMENTAVG_ROW_LENGTHMAX_ROWSROW_FORMATなどの,创建表ステトメントで使用できる種類のテブルオプションを示します。すべてのテブルオプションのリストと各オプションの説明にいては,セクション13.1.17 " create table構文"を参照してください。ただし,ALTER TABLEは,数据目录および索引目录テブルオプションを無視します。

    たとえば,テブルをInnoDBテブルになるように変換するには,次のステトメントを使用します。

    ALTER TABLE t1 ENGINE = InnoDB;

    テブルをInnoDBストレジエンジンに切り替えるときの考慮事項にいては,セクション14.6.4 " MyISAMからInnoDBへのテブルの変換"を参照してください。

    引擎句を指定すると,ALTER TABLEはテブルを再構築します。これは,そのテーブルに指定されたストレージエンジンがすでに存在する場合にも当てはまります。

    既存のInnoDBテブルに対してALTER TABLEtbl_name引擎= INNODBを実行すると,ALTER TABLE操作が実行されます。これは,セクション14.10.4 "テブルのデフラグ"で説明されているように,InnoDBテブルのデフラグに使用できます。InnoDBテブルに対してALTER TABLEtbl_nameを実行しても,同じ機能が実行されます。

    MySQL 5.6.17の時点では,ALTER TABLEtbl_name引擎= INNODBALTER TABLEtbl_nameの両方がオンラ帐号帐号ンDDL算法=复制を使用します。詳細は,セクション14.11.1 "オンラereplicationンDDLの概要"を参照してください。

    テブルのストレジエンジンを変更しようとすると,セクション5.1.7 "サバSQLモド"で説明されているように,その結果は目的のストレ,ジエンジンが使用可能かどうかや,NO_ENGINE_SUBSTITUTIONSQLモドの設定によって影響を受けます。

    デタが誤って失われることのないように,ALTER TABLEを使用して,テブルのストレジエンジンを合并または黑洞に変更することはできません。

    新しい行に使用されるAUTO_INCREMENTカウンタの値を変更するには,次のようにします。

    修改表t2 AUTO_INCREMENT =价值

    このカウンタを,現在使用されている値以下の値にリセットすることはできません。InnoDBMyISAMのどらの場合も,この値が現在AUTO_INCREMENTカラム内にある最大値以下である場合,この値は現在のAUTO_INCREMENTカラムの最大値に1を加えた値にリセットされます。

  • 1つのALTER TABLEステトメントで,カンマで区切られた複数の添加改变下降,および改变句を発行できます。これは,ALTER TABLEステトメントごとに各句が1しか許可されない標準SQLへのMySQL拡張です。たとえば,1のステトメントで複数のカラムを削除するには,次のようにします。

    删除列c,删除列d
  • 改变col_name下降col_name,および指数下降は,標準SQLへのMySQL拡張です。

  • ワードはオプションであり,省略できます。

  • column_definition句は,添加改变に対して,创建表に対するのと同じ構文を使用します。セクション13.1.17 " create table構文"を参照してください。

  • 改变old_col_namenew_col_namecolumn_definition句を使用して,カラムの名前を変更できます。それを行うには,古いカラム名と新しいカラム名,およびそのカラムの現在の定義を指定します。たとえば,整数カラムの名前を一个からbに変更するには,次のように行うことができます。

    ALTER TABLE t1 CHANGE a b INTEGER;

    カラムの名前を変更せずに,その型を変更するには,古いカラム名と新しいカラム名が同じ場合でも,改变構文にはそれらの名前が引き続き必要です。例:

    修改表t1

    修改を使用しても,カラムの名前を変更せずに,その型を変更できます。

    修改表t1的BIGINT NOT NULL;

    修改は,Oracleの互換性のためのALTER TABLEへの拡張です。

    改变または修改を使用する場合は,column_definitionに,デタ型および主键独特的などのンデックス属性以外の,新しいカラムに適用されるすべての属性を含める必要があります。元の定義には存在するが,新しい定義として指定されていない属性は引き継がれません。カラムcol1'我的列'として定義されているときに,このカラムを次のように変更するとします。

    修改表t1的BIGINT值

    結果として得られるカラムは长整型数字として定義されますが,属性'我的专栏'は含まれません。これらを保持するには,ステトメントを次のようにしてください。

    ALTER TABLE t1 MODIFY col1 BIGINT UNSIGNED DEFAULT 1 COMMENT 'my column';
  • 改变または修改を使用してデータ型を変更すると,MySQLは,既存のカラム値を新しい型にできるだけ変換しようとします。

    警告

    この変換によって,デタが変更される可能性があります。たとえば,文字列カラムを短くすると、値が切り捨てられる可能性があります。新しいデータ型への変換によってデータが失われる場合は操作が成功しないようにするには、ALTER TABLEを使用する前に厳密なSQLモモドを有効にします(セクション5.1.7 "サバSQLモド"を参照してください)。

  • テブル行内の特定の位置にカラムを追加するには,第一个またはcol_nameを使用します。デフォルトでは,そのカラムを最後に追加します。また,改变または修改操作で第一个を使用して,テブル内のカラムを並べ替えることもできます。

  • 改变设置默认または改变降低违约は,それぞれ,カラムの新しいデフォルト値を指定するか,または古いデフォルト値を削除します。古いデフォルトが削除され,かカラムをにできる場合,新しいデフォルトはです。カラムをにできない場合,MySQLは,セクション11.6 "デタ型デフォルト値"で説明されているようにデフォルト値を割り当てます。

  • 指数下降は,ンデックスを削除します。これは,標準 SQL への MySQL 拡張です。セクション13.1.24 " drop index構文"を参照してください。ンデックス名に確信がない場合は,显示指数从tbl_nameを使用します。

  • テーブルからカラムが削除された場合,そのカラムは,それが含まれているすべてのインデックスからも削除されます。ereplicationンデックスを構成するすべてのカラムが削除された場合は、そのereplicationンデックスも削除されます。改变または修改を使用して,インデックスが存在するカラムを短くしたときに,結果として得られるカラムの長さがインデックスの長さより短くなった場合,MySQLは自動的にそのインデックスを短くします。

  • テブルに1のカラムしか含まれていない場合は,そのカラムを削除できません。テブルを削除することが目的である場合は,代わりに删除表を使用します。

  • 删除主键は,主キーを削除します。主キーが存在しない場合は、エラーが発生します。主キーのパフォーマンス特性 (特にInnoDBテブルの場合)に,セクション8.3.2 "主キの使用"を参照してください。

    テブルに唯一索引または主键を追加すると,重複キーをできるだけ早く検出できるようにするために,MySQLはそれを一意でないどのインデックスよりも前に格納します。

  • 一部のストレジエンジンでは,。index_type指定子の構文は,使用type_nameです。使用の詳細は,セクション13.1.13 " create index構文"を参照してください。推奨される位置は,カラムリストのあとです。このオプションをカラムリストの前に使用するためのサポートは,将来のMySQLリリースで削除される予定です。

    index_option値は,ンデックスの追加オプションを指定します。使用はそのようなオプションの1です。許可されるindex_option値の詳細は,セクション13.1.13 " create index構文"を参照してください。

  • ALTER TABLEステトメントのあとに,情報を更新するために分析表の実行が必要になることがあります。セクション13.7.5.23 " show index構文"を参照してください。

  • 命令を使用すると,特定の順序で行が含まれる新しいテブルを作成できます。このオプションは主に,ほとんどは特定の順序で行をクエリすることがわかっている場合に役立ます。このオプションをテーブルの大幅な変更のあとに使用すると,パフォーマンスの向上が得られる可能性があります。場合によっては,テーブルが,あとでその並べ替えに使用するカラムごとの順番になっていれば,MySQLでのソートが簡単になることがあります。

    注記

    挿入や削除を行うと,このテブルは指定された順序のままではなくなります。

    命令構文では,ソトのためのカラム名を1。その各カラム名に続けて,オプションで,それぞれ昇順または降順のソ,ト順序を示すASCまたはDESCを指定できます。デフォルトは昇順です。ソト条件として許可されるのはカラム名だけです。任意の式は許可されていません。この句は,ほかのどの句よりもあとの最後に指定するようにしてください。

    InnoDBは常に,クラスタ化された邮箱ンデックスに従ってテブル行を並べ替えるため,命令InnoDBテブルでは意味がありません。

    注記

    パティション化されたテブルに対して使用されている場合,ALTER TABLE……命令は,各パティション内でのみ行を並べ替えます。

  • MyISAMテブルに対してALTER TABLEを使用した場合,一意でない邮箱ンデックスはすべて(修理表として)別のバッチに作成されます。多くのンデックスがあるときは,この方法でALTER TABLEがはるかに早くなります。

    MyISAMテブルの場合は,キの更新を明示的に制御できます。ALTER TABLE……禁用的钥匙を使用して,一意でないereplicationンデックスの更新を停止するようMySQLに指示します。次に,ALTER TABLE……启用钥匙を使用して、不足している以及ンデックスを再作成します。MyISAMはこれを,キーを1つずつ挿入するのに比べてはるかに高速な特殊なアルゴリズムで実行するため,一括挿入操作を実行する前にキーを無効にすると大幅な高速化が得られます。ALTER TABLE……禁用的钥匙を使用するには,先に説明した権限に加えて指数権限が必要です。

    一意でないereplicationンデックスは,無効になっている間,有効なときにはこのereplicationンデックスを使用する选择解释などのステトメントで無視されます。

  • MySQL 5.6.7より前は,ALTER TABLEを使用して外部キカラムの定義を変更すると,参照整合性が失われる可能性がありました。たとえば,値を含む外部キカラムを非空になるように変更すると,値が空の文字列になりました。同様に,親テーブル内の行を削除するALTER TABLE忽略によって,参照整合性が破壊される可能性がありました。

    5.6.7の時点では,参照整合性が失われる可能性のある外部キーカラムへの変更がサーバーによって禁止されます。また,安全でない可能性のある,このようなカラムのデ,タ型への変更も禁止されます。たとえば,VARCHAR (20)VARCHAR (30)への変更は許可されますが,それをVARCHAR (1024)に変更することは,それによって個々の値を格納するために必要なバイト長の数が変更されるため許可されません。回避方法として,カラム定義を変更する前にALTER TABLE……删除外键を使用し,あとでALTER TABLE……添加外键を使用します。

  • 外键および参考文献句は,添加(约束(象征]]外键[index_name)(…)参考文献(…)を実装しているInnoDBおよびNDBストレジエンジンによってサポトされます。セクション14.6.6 " InnoDBとFOREIGN KEY制約"を参照してください。その他のストレジエンジンでは,これらの句は解析されますが,無視されます。检查句は,すべてのストレ,ジエンジンによって解析されますが,無視されます。セクション13.1.17 " create table構文"を参照してください。構文の句を受け入れるが,無視する理由は互換性のためです。つまり,ほかのSQLサーバーからコードを移植し,参照によってテーブルを作成するアプリケーションを実行することを容易にするためです。セクション1.7.2 " MySQLと標準SQLとの違い"を参照してください。

    ALTER TABLEでは,创建表とは異なり,添加外键index_name(指定されている場合)を無視し,自動的に生成された外部キ名を使用します。回避方法として,外部キ名を指定する约束句を含めます。

    添加约束的名字外键(....)…
    重要

    参照がカラム指定の一部として定義されている邮箱ンラ邮箱ンの参考文献指定は,暗黙のうに無視されます。MySQLは,個別の外键指定の一部として定義されている参考文献句のみを受け入れます。

    注記

    パティション化されたInnoDBテブルは,外部キトしていません。この制限は,NDBテブル((线性)的关键によって明示的にパティション化されたテブルを含む)には適用されません。詳細は,セクション19.6.2 "ストレジエンジンに関連するパティショニング制限"を参照してください。

  • InnoDBおよびNDBストレジエンジンは,外部キを削除するためのALTER TABLEの使用をサポトします。

    ALTER TABLEtbl_name删除外键fk_symbol

    詳細は,セクション14.6.6 " InnoDBとFOREIGN KEY制約"を参照してください。

  • MySQL 5.6.6より前は,同じALTER TABLEステトメントでの外部キの追加と削除は,問題が発生する場合があるためサポトされていません。操作ごとに個別のステトメントを使用するようにしてください。MySQL 5.6.6の時点では,同じALTER TABLEステトメントでの外部キの追加と削除はALTER TABLE……算法=原地ではサポトされますが,ALTER TABLE……算法=复制では未サポトのままです。

  • .ibdファ邮箱ル内の独自のテ邮箱ブルスペ邮箱スで作成されたInnoDBテブルの場合は,そのファ,。.ibdファルを破棄するには,次のステトメントを使用します。

    ALTER TABLEtbl_name丢弃表空间;

    これにより,現在の.ibdファルが削除されるため,最初にバックアップがあることを確認してください。テーブルスペースファイルが破棄されている間にテーブルの内容を変更しようとすると,エラーが発生します。テブルスペスファルが破棄されている間に,セクション14.11 " InnoDBとオンラereplicationンDDL "に示されているDDL操作を実行できます。

    バックアップ.ibdファイルを元のテーブルにインポートするには,それをデータベースディレクトリにコピーしてから,次のステートメントを発行します。

    ALTER TABLEtbl_name进口表空间;

    テーブルスペースファイルは,必ずしも,あとでインポートされるサーバー上に作成されている必要はありません。米ySQL 5.6 では、テーブルスペースファイルの別のサーバーからのインポートが機能するのは、両方のサーバーのステータスが GA (General Availablility) であり、かつそれらのバージョンが同じシリーズ内にある場合です。そうでない場合、そのファイルはインポートされるサーバー上に作成されている必要があります。

    注記

    ALTER TABLE……导入表空间機能は,ンポトされたデタに対して外部キ制約を課しません。

    セクション14.5.2 " InnoDB File-Per-Tableモド"を参照してください。

  • テブルのデフォルトの文字セットおよびすべての文字カラム(字符VARCHAR文本)を新しい文字セットに変更するには,次のようなステトメントを使用します。

    ALTER TABLEtbl_name转换为字符集charset_name(核对collation_name];

    このステトメントでは,すべての文字カラムの照合順序も変更されます。使用する照合順序を示す核对句を指定しない場合,このステ,トメントは,その文字セットのデフォルトの照合順序を使用します。この照合順序が目的とするテーブル使用に適していない(たとえば,大文字と小文字が区別される照合順序から大文字と小文字が区別されない照合順序に変更されてしまう)場合は,照合順序を明示的に指定します。

    デタ型がVARCHARか,またはいずれかの文本型であるカラムに対して,转换为字符集は,新しいカラムが確実に元のカラムと同じ数の文字を格納できる十分な長さになるように,必要に応じてデータ型を変更します。たとえば,文本カラムには,そのカラム内の値のバイト長(最大65535)を格納するための2バイト長があります。latin1文本カラムの場合は,各文字に1バイトが必要なため,このカラムには最大65535文字を格納できます。このカラムがuse utf8に変換された場合は,各文字に最大3バイトが必要になる可能性があるため,可能性のある最大の長さは3×65535 = 196605バイトになります。その長さは文本カラムのバイト長には収まらないため,MySQLはそのデータ型を,バイト長に196605の値を記録できる最小の文字列型である简单に変換します。同様に,VARCHARカラムは简单に変換される可能性があります。

    今説明した型のデタ型の変更を回避するには,转换为字符集を使用しないでください。代わりに,修改を使用して個々のカラムを変更します。例:

    修改latin1_text_col文本字符集utf8;修改表VARCHAR表)字符集utf8;

    转换为字符集二进制を指定した場合,字符VARCHAR,および文本カラムは,それぞれ対応するバ邮箱ナリ文字列型(二进制VARBINARYに変換されます。まり,これらのカラムには文字セットが含まれなくなるため,以降の转换为操作は適用されません。

    charset_name默认的である場合は,デタベス文字セットが使用されます。

    警告

    转换为操作は,文字セット間でカラム値を変換します。これは,ある文字セット(latin1など)のカラムがあるが,格納された値が実際には,ほかの何らかの互換性のない文字セット(use utf8など)を使用している場合に必要なものではありません。この場合は,このようなカラムごとに,次を実行する必要があります。

    ALTER TABLE t1 CHANGE c1 c1 BLOBALTER TABLE t1 CHANGE c1 TEXT CHARACTER SET utf8

    これが機能する理由は,カラムとの間で変換する場合は変換が発生しないためです。

    テブルのデフォルトの文字セットのみを変更するには,次のステトメントを使用します。

    ALTER TABLEtbl_name默认字符集charset_name

    ワード默认的はオプションです。デフォルトの文字セットは、あとで (たとえば、ALTER TABLE……添加一列で)テブルに追加するカラムの文字セットを指定しない場合に使用される文字セットです。

mysql_info ()C API関数を使用すると,ALTER TABLEによってコピされた行数,および(忽略が使用されている場合は)一意のキ値の重複のために削除された行数を確認できます。セクション23.7.7.35 " mysql_info() "を参照してください。


本手册下载
PDF (Ltr)- 26.8 mb
PDF (A4)- 26.8 mb