Utilisez l'instruction ALTER TABLE pour modifier la structure d'une table existante. Par exemple, ajoutez des colonnes, créez des index ou modifiez les définitions de colonne.
Notes d'utilisation
Vous ne pouvez pas utiliser l'instruction
ALTER TABLEpour modifier une clé de sharding.Pour utiliser l'instruction
ALTERsur une table contenant un index secondaire global (GSI), vous devez utiliser MySQL 5.7 ou une version ultérieure, ainsi que PolarDB-X 1.0 5.4.1 ou une version ultérieure.
Modifier une table standard
Dans
PolarDB-X 1,0
, la syntaxe de modification d'une table standard est identique à la syntaxe native de MySQL. Pour plus d'informations, consultez la documentation MySQL relative à l'instruction
.
Syntaxe
ALTER [ONLINE|OFFLINE] [IGNORE] TABLE tbl_name
[alter_specification [, alter_specification] ...]
[partition_options]
Example
-
Ajouter une colonne
L'exemple suivant ajoute une colonne nommée
idcardà la tableuser_log:ALTER TABLE user_log ADD COLUMN idcard varchar(30); -
Créer un index local
L'exemple suivant crée un index local nommé
idcard_idxsur la colonneidcardde la tableuser_log:ALTER TABLE user_log ADD INDEX idcard_idx (idcard); -
Renommer un index local
L'exemple suivant renomme l'index
idcard_idxenidcard_idx_newdans la tableuser_log:ALTER TABLE user_log RENAME INDEX `idcard_idx` TO `idcard_idx_new`; -
Supprimer un index local
L'exemple suivant supprime l'index
idcard_idxde la tableuser_log:ALTER TABLE user_log DROP INDEX idcard_idx; -
Modifier une colonne
L'exemple suivant modifie la longueur de la colonne
idcard(de type de donnéesvarchar) de 30 à 40 dans la tableuser_log:ALTER TABLE user_log MODIFY COLUMN idcard varchar(40);
Modifier une table avec un GSI
Column modifications
Lorsque vous modifiez une colonne dans une table contenant un GSI, la syntaxe est identique à celle d'une table standard, mais certaines limitations s'appliquent. Pour plus d'informations, consultez la section Considerations for using global secondary indexes.
-
Le tableau suivant résume la prise en charge des modifications de colonne avec l'instruction ALTER TABLE.
Instruction Clé de sharding de la table principale Clé primaire (également la clé primaire de la table d'index) Colonne d'index unique local Clé de sharding du GSI Colonne d'index unique Colonne d'index Colonne de couverture ADD COLUMN N/A Non pris en charge N/A N/A N/A N/A N/A ALTER COLUMN SET DEFAULT et ALTER COLUMN DROP DEFAULT Non pris en charge Non pris en charge Pris en charge Non pris en charge Non pris en charge Non pris en charge Non pris en charge CHANGE COLUMN Non pris en charge Non pris en charge Pris en charge Non pris en charge Non pris en charge Non pris en charge Non pris en charge DROP COLUMN Non pris en charge Non pris en charge Pris en charge uniquement si la clé unique comporte une seule colonne. Non pris en charge Non pris en charge Non pris en charge Non pris en charge MODIFY COLUMN Non pris en charge Non pris en charge Pris en charge Non pris en charge Non pris en charge Non pris en charge Non pris en charge -
Le tableau suivant résume la prise en charge des modifications d'index avec l'instruction ALTER TABLE.
Instruction Prise en charge ALTER TABLE ADD PRIMARY KEY Pris en charge ALTER TABLE ADD [UNIQUE/FULLTEXT/SPATIAL/FOREIGN] KEY Pris en charge. Vous pouvez ajouter des index locaux sur la table principale et sur la table d'index. Le nom de l'index ne peut pas être identique à celui d'un GSI. ALTER TABLE ALTER INDEX index_name {VISIBLE INVISIBLE} Interdit
ALTER TABLE {DISABLE ENABLE} KEYS Pris en charge. Cette instruction s'exécute uniquement sur la table principale. La modification de l'état du GSI est interdite.
ALTER TABLE DROP PRIMARY KEY Interdit ALTER TABLE DROP INDEX Pris en charge uniquement pour la suppression d'un index local ou d'un index secondaire global. ALTER TABLE RENAME INDEX Interdit
Modifications d'index
Syntaxe
ALTER TABLE tbl_name
alter_specification # Only one alter_specification is supported for GSI modifications.
alter_specification:
| ADD GLOBAL {INDEX|KEY} index_name # You must explicitly specify the index name for a GSI.
[index_type] (index_sharding_col_name,...)
global_secondary_index_option
[index_option] ...
| ADD [CONSTRAINT [symbol]] UNIQUE GLOBAL
[INDEX|KEY] index_name # You must explicitly specify the index name for a GSI.
[index_type] (index_sharding_col_name,...)
global_secondary_index_option
[index_option] ...
| DROP {INDEX|KEY} index_name
| RENAME {INDEX|KEY} old_index_name TO new_index_name
global_secondary_index_option:
[COVERING (col_name,...)] # Covering Index
drds_partition_options # Must contain only the columns specified in index_sharding_col_name.
# Specify the sharding method for the index table.
drds_partition_options:
DBPARTITION BY db_sharding_algorithm
[TBPARTITION BY {table_sharding_algorithm} [TBPARTITIONS num]]
db_sharding_algorithm:
HASH([col_name])
| {YYYYMM|YYYYWEEK|YYYYDD|YYYYMM_OPT|YYYYWEEK_OPT|YYYYDD_OPT}(col_name)
| UNI_HASH(col_name)
| RIGHT_SHIFT(col_name, n)
| RANGE_HASH(col_name, col_name, n)
table_sharding_algorithm:
HASH(col_name)
| {MM|DD|WEEK|MMDD|YYYYMM|YYYYWEEK|YYYYDD|YYYYMM_OPT|YYYYWEEK_OPT|YYYYDD_OPT}(col_name)
| UNI_HASH(col_name)
| RIGHT_SHIFT(col_name, n)
| RANGE_HASH(col_name, col_name, n)
# The following is MySQL DDL syntax.
index_sharding_col_name:
col_name [(length)] [ASC | DESC]
index_option:
KEY_BLOCK_SIZE [=] value
| index_type
| WITH PARSER parser_name
| COMMENT 'string'
index_type:
USING {BTREE | HASH}
Utilisez l'instruction ALTER TABLE ADD GLOBAL INDEX pour ajouter un GSI à une table existante. Cette instruction ajoute le mot-clé GLOBAL à la syntaxe MySQL standard pour spécifier que le nouvel index est un GSI.
Vous pouvez également utiliser l'instruction
ALTER TABLE { DROP | RENAME } INDEX
pour modifier un GSI. Toutefois, certaines limitations s'appliquent lors de la création d'un GSI après la création d'une table.
Pour plus de détails sur les limitations et les conventions relatives aux GSI, consultez la section
Considerations for using global secondary indexes
.
Pour plus d'informations sur les clauses utilisées pour définir un index secondaire global, consultez la section CREATE TABLE.
Exemple
L'exemple suivant montre comment créer un index secondaire global unique après la création d'une table.
-
Créer un GSI
# Create a table. CREATE TABLE t_order ( `id` bigint(11) NOT NULL AUTO_INCREMENT, `order_id` varchar(20) DEFAULT NULL, `buyer_id` varchar(20) DEFAULT NULL, `seller_id` varchar(20) DEFAULT NULL, `order_snapshot` longtext DEFAULT NULL, `order_detail` longtext DEFAULT NULL, PRIMARY KEY (`id`), KEY `l_i_order` (`order_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 dbpartition by hash(`order_id`); # Create a global secondary index (GSI). ALTER TABLE t_order ADD UNIQUE GLOBAL INDEX `g_i_buyer` (`buyer_id`) COVERING (`order_snapshot`) dbpartition by hash(`buyer_id`);Table principale : la table
t_orderutilise le sharding de base de données mais pas le sharding de table. Les données sont réparties entre les bases de données en fonction d'un hachage de la colonneorder_id.Table d'index : la table
g_i_buyerutilise le sharding de base de données mais pas le sharding de table. Les données sont réparties entre les bases de données en fonction d'un hachage de la colonnebuyer_id. La colonneorder_snapshotest spécifiée comme colonne de couverture.Clause de définition d'index :
GLOBAL INDEX.
-
Exécutez l'instruction
SHOW INDEXpour afficher les informations sur les index. Le résultat inclut l'index local sur la clé de shardingorder_idet le GSI, qui couvre les colonnesbuyer_id,id,order_idetorder_snapshot. Dans ce GSI,buyer_idest la clé de sharding de la table d'index. Les colonnesid(clé primaire de la table principale) etorder_id(clé de sharding de la table principale) sont incluses en tant que colonnes de couverture par défaut, etorder_snapshotest la colonne de couverture spécifiée explicitement.mysql> show index from t_order; +---------+------------+-----------+--------------+----------------+-----------+-------------+----------+--------+------+------------+----------+---------------+ | TABLE | NON_UNIQUE | KEY_NAME | SEQ_IN_INDEX | COLUMN_NAME | COLLATION | CARDINALITY | SUB_PART | PACKED | NULL | INDEX_TYPE | COMMENT | INDEX_COMMENT | +---------+------------+-----------+--------------+----------------+-----------+-------------+----------+--------+------+------------+----------+---------------+ | t_order | 0 | PRIMARY | 1 | id | A | 0 | NULL | NULL | | BTREE | | | | t_order | 1 | l_i_order | 1 | order_id | A | 0 | NULL | NULL | YES | BTREE | | | | t_order | 0 | g_i_buyer | 1 | buyer_id | NULL | 0 | NULL | NULL | YES | GLOBAL | INDEX | | | t_order | 1 | g_i_buyer | 2 | id | NULL | 0 | NULL | NULL | | GLOBAL | COVERING | | | t_order | 1 | g_i_buyer | 3 | order_id | NULL | 0 | NULL | NULL | YES | GLOBAL | COVERING | | | t_order | 1 | g_i_buyer | 4 | order_snapshot | NULL | 0 | NULL | NULL | YES | GLOBAL | COVERING | | +---------+------------+-----------+--------------+----------------+-----------+-------------+----------+--------+------+------------+----------+---------------+ -
Exécutez l'instruction
SHOW GLOBAL INDEXpour afficher les informations spécifiques au GSI. Pour plus d'informations, consultez la section SHOW GLOBAL INDEX.mysql> show global index from t_order; +---------------------+---------+------------+-----------+-------------+------------------------------+------------+------------------+---------------------+--------------------+------------------+---------------------+--------------------+--------+ | SCHEMA | TABLE | NON_UNIQUE | KEY_NAME | INDEX_NAMES | COVERING_NAMES | INDEX_TYPE | DB_PARTITION_KEY | DB_PARTITION_POLICY | DB_PARTITION_COUNT | TB_PARTITION_KEY | TB_PARTITION_POLICY | TB_PARTITION_COUNT | STATUS | +---------------------+---------+------------+-----------+-------------+------------------------------+------------+------------------+---------------------+--------------------+------------------+---------------------+--------------------+--------+ | ZZY3_DRDS_LOCAL_APP | t_order | 0 | g_i_buyer | buyer_id | id, order_id, order_snapshot | NULL | buyer_id | HASH | 4 | | NULL | NULL | PUBLIC | +---------------------+---------+------------+-----------+-------------+------------------------------+------------+------------------+---------------------+--------------------+------------------+---------------------+--------------------+--------+ -
Affichez la structure de la table d'index. La table d'index contient la clé primaire, les colonnes de clé de sharding, les colonnes de couverture par défaut et les colonnes de couverture spécifiées explicitement de la table principale. L'attribut
AUTO_INCREMENTest supprimé de la colonne de clé primaire, et les index locaux de la table principale sont exclus. Pour un GSI unique, un index unique est créé par défaut sur toutes ses colonnes de clé de sharding afin d'appliquer la contrainte d'unicité globale.mysql> show create table g_i_buyer; +-----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | Table | Create Table | +-----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | g_i_buyer | CREATE TABLE `g_i_buyer` ( `id` bigint(11) NOT NULL, `order_id` varchar(20) DEFAULT NULL, `buyer_id` varchar(20) DEFAULT NULL, `order_snapshot` longtext, PRIMARY KEY (`id`), UNIQUE KEY `auto_shard_key_buyer_id` (`buyer_id`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8 dbpartition by hash(`buyer_id`) | +-----------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ -
Supprimer un GSI
Supprimez le GSI nommé
g_i_buyer. La table d'index correspondante est également supprimée.ALTER TABLE `t_order` DROP INDEX `g_i_buyer`; -
Renommer un index
Par défaut, le renommage d'un GSI est interdit.