1

我在尝试在 MySQL 5.6 中将表从 MyISAM 转换为 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?

4

1 回答 1

2

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

cid通过在 PRIMARY KEY 之后添加 KEY( ) 来解决此问题,如下所示:

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;
于 2013-04-30T12:39:26.670 回答