将数据库引擎从MyIsam更改为innoDB时出错

时间:2011-08-02 23:58:18

标签: java mysql database innodb myisam

我已将我的Java Web应用程序的数据库引擎从MyIsam更改为innoDB。我正在使用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;

2 个答案:

答案 0 :(得分:3)

最终解决了这个问题,没有时间去完成这个项目。

问题是InnoDB与MyIsam不同,不能使用unsigned int作为外键。

在我的例子中,我不得不改变

`creatorId` INT UNSIGNED NOT NULL,

行:到

`creatorId` INT NOT NULL,

非常简单我只是不知道它是这样做的。

答案 1 :(得分:0)

包含InnoDB引擎的数据库需要每个表的索引字段(可以是indexPrimary Key,甚至是Foreign Key

所以,你的问题是没有引擎可以使用的定义索引(或键)。您应该为正在创建的每个表声明Primary Key

MyISAM - 引擎不需要这个。