4

我有 250 个左右的表 (mysql),它们都共享完全相同的结构,除了索引。其中一个表具有所有正确、当前和最新的索引,我想将该索引结构传播到其他 249 个表。

我发现搜索的所有内容都是关于复制具有其内容和索引结构的表,我不想这样做(每个表中的数据不同,只有结构相同),或者创建一个具有相同内容的新表结构,我也不想这样做。

我希望有一种方法可以使用 ALTER TABLE 告诉 mysql 模仿正确表的表结构并将其应用于另一个表,优化表,然后通过 php 脚本运行这些命令以应用于所有 249 个表,但我不知道是否有一个 ALTER TABLE 命令可以做到这一点。

有小费吗?

4

5 回答 5

4

在“好”表上运行SHOW CREATE TABLE [table_name]。复制索引行并在脚本中使用它们ALTER TABLE CREATE INDEX为每个其他表运行等效项。

如果您希望整个事情完全自动化,则必须从SHOW INDEXESorSHOW CREATE TABLE调用中解析索引定义。但我假设你只需要运行一次,因为这是一个奇怪的情况。

于 2012-08-23T21:17:19.527 回答
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 语句之前创建备份。

于 2015-05-07T22:57:28.287 回答
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;

您需要将 TO 添加到 REMOVE TABLE 语句。

于 2017-03-22T06:28:26.607 回答
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)."`");
}
于 2020-06-03T12:13:27.170 回答
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;

然后复制粘贴到查询窗口。

于 2020-07-11T13:59:47.487 回答