【问题标题】:PhpMyAdmin export does not include PRIMARY KEY as mysqldumpPhpMyAdmin 导出不包括 PRIMARY KEY 作为 mysqldump
【发布时间】:2015-04-14 21:44:03
【问题描述】:

导出与PhpMyAdmin同表的结构:

`DROP TABLE IF EXISTS `test_apprentis`;
CREATE TABLE IF NOT EXISTS `test_apprentis` (
  `a_id` smallint(10) NOT NULL,
  `a_promo_id` smallint(11) NOT NULL,
  `a_cursus` smallint(10) DEFAULT NULL
) ENGINE=MyISAM AUTO_INCREMENT=3665 DEFAULT CHARSET=utf8;`

Export with mysqldump:

DROP TABLE IF EXISTS `test_apprentis`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `test_apprentis` (
  `a_id` smallint(10) NOT NULL AUTO_INCREMENT,
  `a_promo_id` smallint(11) NOT NULL,
  `a_cursus` smallint(10) DEFAULT NULL,
  PRIMARY KEY (`a_id`)
) ENGINE=MyISAM AUTO_INCREMENT=3665 DEFAULT CHARSET=utf8;

使用 PhpMyAdmin,没有 AUTO_INCREMENT 或 PRIMARY KEY 为什么?

【问题讨论】:

  • 这不是 32180971 的副本。该问题专门询问从 Wordpress 导入和导出时发生的错误。答案是相关的,但问题不相关,搜索此问题答案的人不太可能找到该问题。

标签: phpmyadmin mysqldump


【解决方案1】:

这不是一个愚蠢的问题,phpMyAdmin 过去常常在 CREATE TABLE 语句的末尾包含 KEY,并且它们的特征就在它们的列名声明旁边。继他们的2014 changes log之后,在版本4.2.0.0(2014-05-08)之后,导出文件结构发生了变化:

  • rfe #1004 在 SQL 导出的末尾创建索引

所以我们必须查看导出文件的末尾才能找到所有索引信息

【讨论】:

  • 有没有办法在创建表语句下面获取键?第一个表然后键然后第二个表然后键?
【解决方案2】:

我把自己困在一个新手身上! 我已经查看了屏幕上显示的窗口内容,没有向下垂直升降栏! 通过 phpMyAdmin 导出添加自动递增的列信息和创建表后通过 ALTER TABLE 查询的 PRIMARY KEY。

DROP TABLE IF EXISTS `test_apprentis`;
CREATE TABLE IF NOT EXISTS `test_apprentis` (
  `a_id` smallint(10) NOT NULL,
  `a_promo_id` smallint(11) NOT NULL,
  `a_cursus` smallint(10) DEFAULT NULL
) ENGINE=MyISAM AUTO_INCREMENT=3665 DEFAULT CHARSET=utf8;

ALTER TABLE `test_apprentis`
  ADD PRIMARY KEY (`a_id`);

ALTER TABLE `test_apprentis`
  MODIFY `a_id` smallint(10) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=3665;

请接受我对这个愚蠢问题的歉意。

【讨论】:

  • 这并不傻,因为它会在不同的 MYSQL 服务器上运行不同版本的 PMA 造成重大破坏。
  • 我不明白为什么会造成严重破坏? - 它只是将它们移动到一个'alter'语句 - 仍然会得到相同的结果,不是吗?但是 PMA 团队确实会一时兴起。
  • @anoldermark 这会产生需要表具有主键的配置问题。
  • 我不明白这里的解决方案。使用 phpMyAdmin(我现在使用的是 5.1.1)让 IT 完成所有工作而不需要编辑导出脚本不是重点吗?我有一个包含 50 多个表的数据库。我应该在导出脚本中的每个CREATE TABLE 语句中添加新行吗?这不可能。
【解决方案3】:

在这方面使用导出和导入时需要注意的另一件事是导入时的交易数量限制。没有警告表示已超出数量且未执行超出部分。这意味着某些表可能存在但没有更新其索引和/或 AUTO_INCREMENTS,尤其是在导入整个数据库时。 根据表的数量及其结构,可能需要三倍的事务数,因此检查和调整 php.ini 文件中的相关参数是值得的。

【讨论】:

  • 你的答案对我来说是正确的。
【解决方案4】:

如果您想将此行为恢复到以前的工作方式,请编辑文件

phpMyAdmin/libraries/plugins/export/ExportSql.class.php

文件中需要跳过下面一行开头的代码块

if (preg_match('@CONSTRAINT|KEY@', $create_query)) {

最简单的方法就是将该行改为

if (false && preg_match('@CONSTRAINT|KEY@', $create_query)) {

【讨论】:

  • 修改内核绝对不是最好的主意……
  • 仅当您出于某种原因害怕开源项目时。这是他们的观点。我有点恼火,其他人没有看到我的答案是唯一可行的。
  • 该目录和文件在 5.1.1 中不再存在
【解决方案5】:

对于那些需要解决这个问题的人,在mysqldump 期间使用标志--single-transaction,这样它将把PRIMARY KEY 放在CREATE TABLE 下,如下所示:

mysqldump --databases mydatabase --single-transaction -u user -p > ./exported_file_name.sql

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-01
    • 1970-01-01
    • 2020-10-26
    • 2013-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多