我有250个左右的表(mysql),它们共享完全相同的结构,但索引除外。其中一个表具有所有正确的,最新的和最新的索引,我想将该索引结构传播到其他249个表。
我发现搜索的所有内容都是关于复制一个包含其内容和索引结构的表格,我不想这样做(每个表格中的数据不同,只有结构相同),或者创建一个具有相同结构的新表,我也不想这样做。
我希望有一种方法可以使用ALTER TABLE来告诉mysql模仿正确表的表结构并将其应用到另一个表,优化表,然后通过一个表运行这些命令php脚本应用于所有249个表,但我无法弄清楚是否有ALTER TABLE命令可以执行此操作。
任何提示?
答案 0 :(得分:3)
您可以使用CREATE TABLE LIKE
命令创建具有正确结构+索引但没有数据的新表,然后使用INSERT
语句复制旧数据。
例如,假设我们将users_master
作为具有正确索引的表,并且我们希望为表users_n
提供正确的索引。我们可以这样做:
CREATE TABLE users_n_indexed LIKE users_master;
INSERT users_n_indexed SELECT * FROM users_n;
DROP TABLE users_n;
RENAME TABLE users_n_indexed users_n;
当然在运行任何DROP语句之前创建备份。
答案 1 :(得分:2)
在“好”表上运行SHOW CREATE TABLE [table_name]
。复制索引行并使用脚本中的索引行为每个其他表运行等效的ALTER TABLE CREATE INDEX
。
如果您希望整个事情完全自动化,则必须从SHOW INDEXES
或SHOW CREATE TABLE
调用解析索引定义。但我假设你只需要运行一次,因为这是一个奇怪的情况。
答案 2 :(得分:1)
杰里米给出了很好的答案。以防你的mysql抱怨,
CREATE TABLE users_n_indexed LIKE users_master;
INSERT users_n_indexed SELECT * FROM users_master;
DROP TABLE users_n;
RENAME TABLE users_n_indexed TO users_n;
您需要在REMOVE TABLE语句中添加TO。
答案 3 :(得分:0)
我花了一些时间为此做些事情。最后,我的要求发生了变化,所以我无法对其进行很好的测试。但我相信这将在没有太大变化的情况下起作用。我不喜欢编辑“ SHOW CREATE”的输出-太脏了。因此,我改为使用“ SHOW INDEX”创建的数据库字段:
$res = mysqli_query($conn,"SHOW INDEX FROM tableA");
$indexes = array();
$nonuniques = array();
while($row = mysqli_fetch_assoc($res))
{ if(!isset($indexes[$row['Key_name']]))
$indexes[$row['Key_name']] = array();
$indexes[$row['Key_name']][] = $row['Column_name'];
$nonuniques[$row['Key_name']] = $row['Non_unique'];
}
foreach($indexes AS $index => $fields)
{ $prefix = "";
$indexname = "`".$index."`";
if($index == "PRIMARY")
{ $indexname = "";
$prefix = "PRIMARY";
}
else if($nonuniques[$index] == 0)
$prefix = "UNIQUE";
mysqli_query($conn,"ALTER TABLE tableB ADD ".$prefix." INDEX ".$indexname." ("`".implode("`,`", $fields)."`");
}
答案 4 :(得分:0)
这是旧帖子,但我认为我可以帮助其他人。您可以执行以下操作:
SELECT concat("ALTER TABLE ",trim(TABLE_NAME)),group_concat(IF(INDEX_NAME="PRIMARY",
"ADD PRIMARY KEY "," ADD INDEX `"),INDEX_NAME,"` (`",column_name,"` ASC) "), ";"
FROM INFORMATION_SCHEMA.STATISTICS WHERE TABLE_SCHEMA = 'SCHEMA' and table_name like "TABLE_NAME%"
and seq_in_index=1 group by table_name;`
否则将索引复制到一个具有相同字段的表:
SELECT concat("ALTER TABLE ",trim(b.TABLE_NAME)),
group_concat(IF(a.INDEX_NAME="PRIMARY","ADD PRIMARY KEY "," ADD INDEX `"),
a.INDEX_NAME,"` (`",a.column_name,"` ASC) "), ";" FROM INFORMATION_SCHEMA.STATISTICS a
join INFORMATION_SCHEMA.STATISTICS b WHERE a.TABLE_SCHEMA = 'SCHEMA' and
a.table_name ="INDEX_TABLE" and b.table_name like "TABLES_TO_INDEX%" and
a.seq_in_index=1 group by b.table_name;
然后将其复制粘贴到查询窗口。