簡體   English   中英

如何將 SHOW INDEX 轉換成 ALTER TABLE 以在 MySQL 中添加索引

[英]How to convert SHOW INDEX into ALTER TABLE to add Index in MySQL

我在桌子上SHOW INDEX ,這是我得到的 output:

Table: logfile
Non_unique: 0
Key_name: PRIMARY
Seq_in_index: 1
Column_name: id
Collation: A
Cardinality: 759103
Sub_part: NULL
Packed: NULL
Null:
Index_type: BTREE
Comment:
Index_comment:

鑒於此信息,我如何構造ALTER語句以將索引添加到表中?

SHOW INDEX 沒有足夠的信息。 你可以試試這個:

select concat('ALTER TABLE `', table_schema, '`.`', table_name, '` ADD ', 
  if(non_unique, '', 'UNIQUE '), 'INDEX `', index_name, '` (', 
  group_concat('`', column_name, '`' order by seq_in_index), ');') as _ddl
from information_schema.statistics 
where (table_schema, table_name) = (?, ?) 
group by table_schema, table_name, index_name, non_unique;

您需要在我留下占位符的地方填寫模式和表名?,?。

這只是為了讓你開始。 我知道它沒有考慮一些選項,包括前綴索引、表達式索引或注釋。 我將把它留給讀者作為練習。

它還會為每個索引生成一個單獨的 alter table 語句。 如果你想做一個alter table來添加所有索引,使用一個子查詢為每個索引生成列列表,然后group_concat()在外部查詢中組合它們。

我在上面擴展了比爾的好答案。 Output 選項擴展為包括 ADD PRIMARY KEY、ADD UNIQUE INDEX 或 ADD INDEX

select concat('ALTER TABLE ', table_schema, '.', table_name, ' ADD ', 
  if(index_name = 'PRIMARY', 'PRIMARY KEY ', if(non_unique, 'INDEX ', 'UNIQUE INDEX ')), 
  if (index_name = 'PRIMARY','', index_name), ' (', group_concat('', column_name, '' order by seq_in_index), ');') 
  as 'alter table statement'
from information_schema.statistics 
where table_schema = '<add your table schema here>' 
group by table_schema, table_name, index_name, non_unique
order by table_schema, table_name, non_unique asc

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM