Ошибка преобразования таблицы из InnoDB в MyISAM (может быть только один автоматический столбец, и он должен быть определен как ключ)

У меня возникают проблемы при попытке преобразовать таблицу из MyISAM в InnoDB в MySQL 5.6.

Ниже приведен дамп таблицы:

--
-- Table structure for table `companies`
--

DROP TABLE IF EXISTS `companies`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `companies` (
  `uid` int(20) NOT NULL,
  `cid` int(20) NOT NULL AUTO_INCREMENT,
  `cname` varchar(500) NOT NULL,
  `rfc` varchar(20) NOT NULL,
  `address` varchar(1000) NOT NULL,
  `dbUseExternal` tinyint(1) NOT NULL DEFAULT '0',
  `dbHost` varchar(50) NOT NULL,
  `dbPort` varchar(50) NOT NULL,
  `dbUser` varchar(50) NOT NULL,
  `dbPass` varchar(50) NOT NULL,
  `dbSSL` varchar(50) NOT NULL,
  `dbDriver` varchar(50) NOT NULL,
  `dbName` varchar(50) NOT NULL,
  `status` int(10) NOT NULL,
  PRIMARY KEY (`uid`,`cid`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
/*!40101 SET character_set_client = @saved_cs_client */;

Это работает как MyISAM. Но, если я пытаюсь преобразовать его в InnoDB (или если я пытаюсь редактировать этот дамп, чтобы вставить его в командную строку как файл SQL), я получаю следующую ошибку:

Неправильное определение таблицы; может быть только один автоматический столбец, и он должен быть определен как ключ

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

Кроме того, информация, которую я нашел относительно ошибки, всегда из-за очевидного отсутствующего ключа или дублирующего определения AUTO_INCREMENT. Еще одна вещь, которую я вижу, в целом прокомментирована, это то же самое верно для MyISAM и InnoDB.

Итак, почему это работает для MyISAM, а не для InnoDB?

1 ответ

Решение

В InnoDB ключи auto_increment должны: либо иметь свой собственный индекс, либо, по крайней мере, быть основным субиндексом составного индекса. (в КЛЮЧЕ (а, б)).

Исправьте это, добавив ключ (cid) после вашего ПЕРВИЧНОГО КЛЮЧА, вот так:

CREATE TABLE `companies2` (
  `uid` int(20) NOT NULL,
  `cid` int(20) NOT NULL AUTO_INCREMENT,
  `cname` varchar(500) NOT NULL,
  `rfc` varchar(20) NOT NULL,
  `address` varchar(1000) NOT NULL,
  `dbUseExternal` tinyint(1) NOT NULL DEFAULT '0',
  `dbHost` varchar(50) NOT NULL,
  `dbPort` varchar(50) NOT NULL,
  `dbUser` varchar(50) NOT NULL,
  `dbPass` varchar(50) NOT NULL,
  `dbSSL` varchar(50) NOT NULL,
  `dbDriver` varchar(50) NOT NULL,
  `dbName` varchar(50) NOT NULL,
  `status` int(10) NOT NULL,
  PRIMARY KEY (`uid`,`cid`),
  KEY(`cid`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
Другие вопросы по тегам