在 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 注释语法。