Грешка при смяна на DB машина от MyIsam на innoDB

Промених своя DB двигател на моето Java уеб приложение на innoDB от MyIsam. Използвам MySql DB. По някаква причина сега получавам грешка при създаването на моите db таблици, които се добавят чрез пакет.

Грешката, която получавам е: java.sql.BatchUpdateException.

Какви са последиците от промяната между тези две DB машини и как да поправя това, което съм сбъркал?

РЕДАКТИРАНЕ

Пълното проследяване на стека:

java.sql.SQLException: Can't create table 'schedule.course2user' (errno: 150)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1075)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3562)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3494)
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1960)
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2114)
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2690)
    at com.mysql.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1648)
    at com.mysql.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1567)
    at database.DBCreator.execList(DBCreator.java:203)
    at database.DBCreator.createDatabase(DBCreator.java:215)
    at database.DBCreator.main(DBCreator.java:248)

Командите на DB, които не работят с innoDB, но работят с MyIsam:

CREATE  TABLE IF NOT EXISTS `schedule`.`course` (
`id` INT NOT NULL AUTO_INCREMENT ,
`name` VARCHAR(45) NOT NULL UNIQUE,
`description` BLOB ,
`credits` TINYINT(1) DEFAULT '0' ,
`capacity` INT DEFAULT '0' ,
`isRemoved` TINYINT(1)  NULL DEFAULT '0' ,
`groupId` INT  NULL DEFAULT '0' ,
`creatorId` INT UNSIGNED NOT NULL ,
PRIMARY KEY (`id`) ,
INDEX `fk_creator` (`creatorId` ASC) ,
CONSTRAINT `fk_creator` FOREIGN KEY (`creatorId` )REFERENCES `schedule`.`course` (`id` ) ON DELETE CASCADE ON UPDATE NO ACTION ) 
ENGINE = innoDB DEFAULT CHARACTER SET = utf8;

person Nachshon Schwartz    schedule 02.08.2011    source източник
comment
Трябва да ни предоставите пълното проследяване на стека.   -  person Benjamin Muschko    schedule 03.08.2011
comment
Без да видим вашите дефиниции на таблици, няма да можем да видим какво не е наред.   -  person OrangeDog    schedule 03.08.2011
comment
@OrangeDog Актуализирах го.   -  person Nachshon Schwartz    schedule 03.08.2011


Отговори (2)


Най-накрая го реших и с малко време за изпълнение на този проект.

Проблемът е, че InnoDB за разлика от MyIsam не може да използва неподписан int като външен ключ.

В моя пример трябваше да променя

`creatorId` INT UNSIGNED NOT NULL,

линия: до

`creatorId` INT NOT NULL,

доста просто, просто не знаех, че действа по този начин.

person Nachshon Schwartz    schedule 03.08.2011

База данни с InnoDB-двигател изисква поле за индекс на таблица (което може да бъде index или Primary Key или дори Foreign Key).

Така че вашият проблем изглежда е, че няма дефиниран индекс (или ключ), който двигателят да може да използва. Трябва да декларирате Primary Key за всяка таблица, която създавате.

MyISAM-двигателят не изисква това.

person Lukas Knuth    schedule 03.08.2011
comment
Можете да имате множество колони pk в innodb, както и в myisam - person Esben Skov Pedersen; 03.08.2011
comment
Така че този отговор не помага, тъй като вече имам първичен ключ (понякога няколко) за тези таблици - person Nachshon Schwartz; 03.08.2011