2013-04-30 8 views
1

MySQL 5.6에서 MyISAM에서 InnoDB로 테이블을 변환하는 데 문제가 있습니다.InnoDB에서 MyISAM으로 테이블을 변환하는 문제 (단 하나의 자동 열만있을 수 있으며 키로 정의해야 함)

-- 
-- 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으로 작동합니다

다음은 테이블 덤프입니다. 내가 이노로 변환하려고하면 (내가 SQL 파일로 명령 행에 삽입이 덤프를 편집하려고하면 나) 그러나, 나는 다음과 같은 오류 얻을 :

Incorrect table definition; there can be only one auto column and it must be defined as a key

을 그 오류를 이해 적어도 내가 한 줄 알았다. 저는 실제로 하나 이상의 AUTO_INCREMENT 열을 사용하지 않고 은 기본 키로 정의 된입니다.

또한 오류와 관련하여 찾은 정보는 명백한 누락 된 키 또는 중복 된 AUTO_INCREMENT 정의 때문입니다. 내가 일반적으로 언급 한 또 다른 사실은 은 MyISAM과 InnoDB에 대해 동일하다는 것입니다..

그래서 MyISAM과 InnoDB에서 작동하지 않는 이유는 무엇입니까?

미리 의견을 보내 주셔서 감사합니다. 이노에

프란

+0

'(cid)'혼자? – eggyal

+0

각 클라이언트에 대해 auto_increment를 1로 설정하려면 MyISAM에서 잘 작동하고 있습니다. 새로운'uid '를 추가하면 자동으로'cid' = 1을 얻고,'uid'를 위해 하나씩 증가합니다. 회사를 등록하는 사용자가 있습니다. 따라서 각 레코드는 고유 한'uid'-'cid'입니다. –

+0

아마도 [이 답변] (http://stackoverflow.com/a/11321211) 도움이 될 것입니다? – eggyal

답변

2

는 AUTO_INCREMENT 키를 가져야한다 : 하나 자신의 인덱스를 가지고, 또는 적어도 복합 지표의 기본 서브 인덱스 될. (KEY (a, b)의 a). 과 같이, 당신의 PRIMARY KEY 후 KEY (cid)를 추가하여

수정이 : 당신이 아니라 그냥 순수 합성 AUTO_INCREMENT PK보다, (UID, CID)``의 PK를 원하는 이유는 무엇

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; 
+0

그러나, 당신은 이것을 잃을 것입니다 (귀하의 코멘트에서) : "각 클라이언트마다 1부터 auto_increment까지 MyISAM에서 잘 작동하고 있습니다. 새 uid를 추가하면 자동으로 cid = 1이되고, 하나씩 증가합니다 uid. 회사를 등록하는 사용자가 있습니다. 따라서 각 레코드는 고유 ID입니다. " –

+0

당신의 코멘트를 볼 때까지 나는 흥분하기 시작했습니다. 어쨌든 답변을 주셔서 감사합니다. 좋은 답변입니다. :-) –

+0

절대적으로해야하는 경우 사용자 지정 트리거를 사용하여 수행 할 수 있습니다. eggyal의 질문에 대한 답변과 연결된 대답은 매우 유사한 것을 설명합니다. 그러나 그것은 번거 로움의 가치가있는 것처럼 들리지 않습니다. 너까지 : –