问题转换表从InnoDB到MyISAM(只能有一个自动列,必须定义为键)

时间:2013-04-30 12:09:40

标签: mysql innodb myisam database-engine

我在尝试将表格从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?

1 个答案:

答案 0 :(得分:2)

在InnoDB中,auto_increment键必须:要么拥有自己的索引,要么至少是复合索引的主要子索引。 (KEY(a,b)中的a。)

通过在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;