我在尝试将表格从MyISAM转换为MySQL 5.6中的InnoDB时遇到了问题。
以下是表转储:
--
-- 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?
答案 0 :(得分:2)
通过在PRIMARY KEY之后添加一个KEY(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;