重要
このページは英語版のページを機械翻訳しています。原文はこちらからご覧ください。

他の机

このステートメントは、既存のテーブルを変更して、新しいテーブル構造に準拠させます。ステートメントALTER TABLEは、次の目的で使用できます。

あらすじ

AlterTableStmt
ALTERIgnoreOptionalTABLETableNameAlterTableSpecListOptAlterTablePartitionOptANALYZEPARTITIONPartitionNameListINDEXIndexNameListAnalyzeOptionListOptCOMPACTTIFLASHREPLICA
TableName
Identifier.Identifier
AlterTableSpec
TableOptionListSETTIFLASHREPLICALengthNumLocationLabelListCONVERTTOCharsetKwCharsetNameDEFAULTOptCollateADDColumnKeywordOptIfNotExistsColumnDefColumnPosition(TableElementList)ConstraintPARTITIONIfNotExistsNoWriteToBinLogAliasOptPartitionDefinitionListOptPARTITIONSNUMCHECKTRUNCATEPARTITIONOPTIMIZEREPAIRREBUILDPARTITIONNoWriteToBinLogAliasOptAllOrPartitionNameListCOALESCEPARTITIONNoWriteToBinLogAliasOptNUMDROPColumnKeywordOptIfExistsColumnNameRestrictOrCascadeOptPRIMARYKEYPARTITIONIfExistsPartitionNameListKeyOrIndexIfExistsCHECKIdentifierFOREIGNKEYIfExistsSymbolEXCHANGEPARTITIONIdentifierWITHTABLETableNameWithValidationOptIMPORTDISCARDPARTITIONAllOrPartitionNameListTABLESPACEREORGANIZEPARTITIONNoWriteToBinLogAliasOptReorganizePartitionRuleOptORDERBYAlterOrderItem,DISABLEENABLEKEYSMODIFYColumnKeywordOptIfExistsCHANGEColumnKeywordOptIfExistsColumnNameColumnDefColumnPositionALTERColumnKeywordOptColumnNameSETDEFAULTSignedLiteral(Expression)DROPDEFAULTCHECKIdentifierEnforcedOrNotINDEXIdentifierIndexInvisibleRENAMECOLUMNKeyOrIndexIdentifierTOIdentifierTO=ASTableNameLockClauseAlgorithmClauseFORCEWITHWITHOUTVALIDATIONSECONDARY_LOADSECONDARY_UNLOADAUTO_INCREMENTAUTO_ID_CACHEAUTO_RANDOM_BASESHARD_ROW_ID_BITSEqOptLengthNumCACHENOCACHE

いくつかの初期データを使用してテーブルを作成します。

CREATE TABLE t1 (id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, c1 INT NOT NULL);
INSERT INTO t1 (c1) VALUES (1),(2),(3),(4),(5);
Query OK, 0 rows affected (0.11 sec)

Query OK, 5 rows affected (0.03 sec)
Records: 5  Duplicates: 0  Warnings: 0

次のクエリでは、列c1にインデックスが付けられていないため、全表スキャンが必要です。

EXPLAIN SELECT * FROM t1 WHERE c1 = 3;
+-------------------------+----------+-----------+---------------+--------------------------------+
| id                      | estRows  | task      | access object | operator info                  |
+-------------------------+----------+-----------+---------------+--------------------------------+
| TableReader_7           | 10.00    | root      |               | data:Selection_6               |
| └─Selection_6           | 10.00    | cop[tikv] |               | eq(test.t1.c1, 3)              |
|   └─TableFullScan_5     | 10000.00 | cop[tikv] | table:t1      | keep order:false, stats:pseudo |
+-------------------------+----------+-----------+---------------+--------------------------------+
3 rows in set (0.00 sec)

ステートメントALTER TABLE .. ADD INDEXを使用して、テーブルt1にインデックスを追加できます。 EXPLAINは、元のクエリがインデックス範囲スキャンを使用することを確認します。これはより効率的です。

ALTER TABLE t1 ADD INDEX (c1);
EXPLAIN SELECT * FROM t1 WHERE c1 = 3;
Query OK, 0 rows affected (0.30 sec)

+------------------------+---------+-----------+------------------------+---------------------------------------------+
| id                     | estRows | task      | access object          | operator info                               |
+------------------------+---------+-----------+------------------------+---------------------------------------------+
| IndexReader_6          | 10.00   | root      |                        | index:IndexRangeScan_5                      |
| └─IndexRangeScan_5     | 10.00   | cop[tikv] | table:t1, index:c1(c1) | range:[3,3], keep order:false, stats:pseudo |
+------------------------+---------+-----------+------------------------+---------------------------------------------+
2 rows in set (0.00 sec)

TiDBは、DDLの変更が特定のALTERアルゴリズムを使用することを表明する機能をサポートしています。これは単なるアサーションであり、テーブルの変更に使用される実際のアルゴリズムを変更するものではありません。クラスタのピーク時にのみ即時のDDL変更を許可する場合に役立ちます。

ALTER TABLE t1 DROP INDEX c1, ALGORITHM=INSTANT;
Query OK, 0 rows affected (0.24 sec)

INPLACEアルゴリズムを必要とする操作でALGORITHM=INSTANTアサーションを使用すると、ステートメントエラーが発生します。

ALTER TABLE t1 ADD INDEX (c1), ALGORITHM=INSTANT;
ERROR 1846 (0A000): ALGORITHM=INSTANT is not supported. Reason: Cannot alter table by INSTANT. Try ALGORITHM=INPLACE.

ただし、 INPLACE操作にALGORITHM=COPYアサーションを使用すると、エラーではなく警告が生成されます。これは、TiDBがアサーションをこのアルゴリズム以上として解釈するためです。 TiDBが使用するアルゴリズムはMySQLとは異なる可能性があるため、この動作の違いはMySQLの互換性に役立ちます。

ALTER TABLE t1 ADD INDEX (c1), ALGORITHM=COPY;
SHOW WARNINGS;
Query OK, 0 rows affected, 1 warning (0.25 sec)

+-------+------+---------------------------------------------------------------------------------------------+
| Level | Code | Message                                                                                     |
+-------+------+---------------------------------------------------------------------------------------------+
| Error | 1846 | ALGORITHM=COPY is not supported. Reason: Cannot alter table by COPY. Try ALGORITHM=INPLACE. |
+-------+------+---------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

MySQLの互換性

次の主な制限は、TiDBのALTER TABLEに適用されます。

  • 現在、 ALTER TABLEのステートメントで複数の変更を行うことはサポートされていません。

  • 主キー列のReorg-データタイプの変更はサポートされていません。

  • パーティション表の列タイプの変更はサポートされていません。

  • 生成された列の列タイプの変更はサポートされていません。

  • 一部のデータ型(たとえば、一部のTIME、Bit、Set、Enum、およびJSON型)の変更は、TiDBとMySQL間のCAST関数の動作の互換性の問題のため、サポートされていません。

  • 空間データ型はサポートされていません。

  • ALTER TABLE t CACHE | NOCACHEはMySQL構文のTiDB拡張です。詳細については、 キャッシュされたテーブルを参照してください。

その他の制限については、 MySQLの互換性を参照してください。

も参照してください