Ошибка при смене движка БД с MyIsam на innoDB

Я изменил свой механизм БД моего веб-приложения Java на innoDB с MyIsam. Я использую базу данных MySql. По какой-то причине я теперь получаю сообщение об ошибке при создании моих таблиц db, которые добавляются в пакетном режиме.

Я получаю следующее сообщение об ошибке: java.sql.BatchUpdateException.

Каковы последствия переключения между этими двумя механизмами БД и как мне исправить то, что я сделал неправильно?

ИЗМЕНИТЬ

Полная трассировка стека:

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)

Команды БД, которые не работают с 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, не может использовать unsigned 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-Engine этого не требует.

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