Назад | Перейти на главную страницу

Флаг 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)?

AUTO_INCREMENT - это вариант только для MySQL (другое программное обеспечение баз данных использует другие команды - например, PostgreSQL использует специальный тип столбца, называемый SERIAL).

Поэтому при экспорте с --compatible=postgres в дамп он не попадет.

Вы можете прекратить экспорт с флагом совместимости PostgreSQL или вручную добавить AUTO_INCREMENT вариант. В любом случае, если вы действительно планируете импортировать эту схему в PostgreSQL, вам придется изменить файл дампа, чтобы изменить тип столбца на SERIAL для любого столбца, который вы хотите увеличить автоматически.


Обратите внимание, что, несмотря на название, --compatible вариант не преобразовать схему в форму, которая гарантированно будет работать в выбранной вами базе данных.

Все, что делает этот вариант, это удалять вещи, которые являются уникальными для MySQL, так что вам будет легче завершить преобразование самостоятельно, вручную или с помощью какого-либо сценария, который вы создали.

Из документация:

Этот вариант не гарантирует совместимость с другими серверами. Он включает только те значения режима SQL, которые в настоящее время доступны для обеспечения большей совместимости вывода дампа. Например, --compatible=oracle не сопоставляет типы данных с типами Oracle и не использует синтаксис комментариев Oracle.