Ошибка преобразования таблицы из 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;