表列的 auto_increment 标志未被备份保留?

表列的 auto_increment 标志未被备份保留?

在 MySQL-5.1.73 上转储数据库并将其加载到 MySQL-5.5 中后,我注意到至少有一个表的主键没有auto_increment转移其标志...describe table原文如下:

+-----------+--------------+------+-----+---------+----------------+
| Field     | Type         | Null | Key | Default | Extra          |
+-----------+--------------+------+-----+---------+----------------+
| FIELD_ID  | bigint(20)   | NO   |     | 0       |                |
| ID        | bigint(20)   | NO   | PRI | NULL    | auto_increment |
| ISSUE_ID  | bigint(20)   | NO   | MUL | 0       |                |
| LOCK_HASH | varchar(255) | YES  | MUL | NULL    |                |
| LOCK_TIME | bigint(20)   | YES  |     | NULL    |                |
| RANK      | varchar(255) | NO   | MUL | NULL    |                |
| TYPE      | int(11)      | NO   |     | 0       |                |
+-----------+--------------+------+-----+---------+----------------+

但是,加载到目标之后,最后一列是空的——字段auto_increment的标志ID消失了。

事实上,查看转储后,我看到表的定义如下:

CREATE TABLE "AO_60DB71_LEXORANK" (
  "FIELD_ID" bigint(20) NOT NULL DEFAULT '0',
  "ID" bigint(20) NOT NULL,
  "ISSUE_ID" bigint(20) NOT NULL DEFAULT '0',
  "LOCK_HASH" varchar(255) COLLATE utf8_bin DEFAULT NULL,
  "LOCK_TIME" bigint(20) DEFAULT NULL,
  "RANK" varchar(255) COLLATE utf8_bin NOT NULL,
  "TYPE" int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY ("ID"),
  KEY "index_ao_60db71_lexorank_rank" ("RANK"),
  KEY "index_ao_60db71_lex604083109" ("ISSUE_ID"),
  KEY "index_ao_60db71_lex1632828616" ("LOCK_HASH")
);

没有明显的指令来设置 ID 自动增加...使用的非默认标志mysqldump是:

extended-insert=false
compatible=postgres
single-transaction

这是一个已知问题吗?我是否应该尝试使用 MySQL (Oracle) 提交错误报告?

答案1

AUTO_INCREMENT是仅限 MySQL 的选项(其他数据库软件使用不同的命令 - 例如,PostgreSQL 使用一种称为 的特殊列类型SERIAL)。

因此,当您使用--compatible=postgres它导出时将不会包含在转储中。

您可以使用 PostgreSQL 兼容性标志停止导出,也可以手动添加该AUTO_INCREMENT选项。无论哪种情况,如果您确实计划将此模式导入 PostgreSQL,则必须修改转储文件以将列类型更改为SERIAL您想要自动递增的任何列。


请注意,尽管名称不同,但--compatible选项才不是将模式转换为保证能在您选择的数据库中工作的形式。

该选项的作用是消除MySQL 独有的东西,以便您可以更轻松地自己完成转换,可以手动完成,也可以使用您构建的某种脚本。

来自文档

此选项不保证与其他服务器的兼容性。它仅启用当前可用的 SQL 模式值,以使转储输出更兼容。例如,--compatible=oracle不将数据类型映射到 Oracle 类型或使用 Oracle 注释语法。

相关内容