【发布时间】:2018-05-07 04:38:06
【问题描述】:
createTable() 方法有效,我一直在创建其他简单的表,没有问题。
我正在使用 MySQL 服务器 8.0
这是对表格的测试,然后我将编写一个脚本来创建它们。我一直有这个错误:
无法创建表,SQLException: 无法添加外键约束
但我不知道出了什么问题。
if(!database.checkTable("maps")){
String maps = "CREATE TABLE maps ("
+ "name VARCHAR(32) NOT NULL,"
+ "mapType VARCHAR(32) NOT NULL,"
+ "world VARCHAR(32) NOT NULL,"
+ "referenceId INT(32) NOT NULL,"
+ "regionId INT(32) NOT NULL,"
+ "testmode BIT(1) NOT NULL,"
+ "edition BIT(1) NOT NULL,"
+ "finished BIT(1) NOT NULL,"
+ "PRIMARY KEY (name, referenceId, regionId))"
+ "ENGINE = InnoDB "
+ "DEFAULT CHARACTER SET = utf8;";
database.createTable(maps);
}
if(!database.checkTable("regions")){
String regions = "CREATE TABLE regions ("
+ "id INT(32) NOT NULL AUTO_INCREMENT,"
+ "minLocationId INT(32) NOT NULL,"
+ "maxLocationId INT(32) NOT NULL,"
+ "PRIMARY KEY (id, minLocationId, maxLocationId),"
+ "CONSTRAINT `regionMapFk`"
+ "FOREIGN KEY (id)"
+ "REFERENCES maps (regionId)"
+ "ON DELETE CASCADE "
+ "ON UPDATE CASCADE)"
+ "ENGINE = InnoDB "
+ "DEFAULT CHARACTER SET = utf8;";
database.createTable(regions);
}
if(!database.checkTable("locations")){
String locations = "CREATE TABLE locations ("
+ "id INT(16) NOT NULL AUTO_INCREMENT, "
+ "x INT(16) NOT NULL, "
+ "y INT(16) NOT NULL, "
+ "z INT(16) NOT NULL, "
+ "PRIMARY KEY(id),"
+ "CONSTRAINT `minLocationRegionFk`"
+ "FOREIGN KEY (id)"
+ "REFERENCES regions (minLocationId)"
+ "ON DELETE CASCADE "
+ "ON UPDATE CASCADE,"
+ "CONSTRAINT `maxLocationRegionFk`"
+ "FOREIGN KEY (id)"
+ "REFERENCES regions (maxLocationId)"
+ "ON DELETE CASCADE "
+ "ON UPDATE CASCADE,"
+ "CONSTRAINT `locationMapFk`"
+ "FOREIGN KEY (id)"
+ "REFERENCES maps (referenceId)"
+ "ON DELETE CASCADE "
+ "ON UPDATE CASCADE)"
+ "ENGINE = InnoDB "
+ "DEFAULT CHARACTER SET = utf8;";
database.createTable(locations);
}
[23:51:36 WARN]:java.sql.SQLException:无法添加外键 约束 [23:51:36 警告]:在 com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1073) [23:51:36 警告]:在 com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3593)[23:51:36 警告]:在 com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3525)[23:51:36 警告]:在 com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1986) [23:51:36 警告]:在 com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2140) [23:51:36 警告]:在 com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2620) [23:51:36 警告]:在 com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2570) [23:51:36 警告]:在 com.mysql.jdbc.StatementImpl.execute(StatementImpl.java:779)[23:51:36 警告]:在 com.mysql.jdbc.StatementImpl.execute(StatementImpl.java:622)[23:51:36 警告]:在 power.database.MySQL.createTable(MySQL.java:104) [23:51:36 警告]:在 power.managers.DatabaseManager.createTables(DatabaseManager.java:81) [23:51:36 警告]:在 power.managers.DatabaseManager.startDatabase(DatabaseManager.java:40) [23:51:36 警告]:在 power.managers.DatabaseManager.(DatabaseManager.java:30) [23:51:36 警告]:在 power.logic.ClanBattles.onEnable(ClanBattles.java:44)[23:51:36 警告]: 在 org.bukkit.plugin.java.JavaPlugin.setEnabled(JavaPlugin.java:321) [23:51:36 警告]:在 org.bukkit.plugin.java.JavaPluginLoader.enablePlugin(JavaPluginLoader.java:340) [23:51:36 警告]:在 org.bukkit.plugin.SimplePluginManager.enablePlugin(SimplePluginManager.java:405) [23:51:36 警告]:在 org.bukkit.craftbukkit.v1_8_R3.CraftServer.loadPlugin(CraftServer.java:357) [23:51:36 警告]:在 org.bukkit.craftbukkit.v1_8_R3.CraftServer.enablePlugins(CraftServer.java:317) [23:51:36 警告]:在 org.bukkit.craftbukkit.v1_8_R3.CraftServer.reload(CraftServer.java:741) [23:51:36 警告]:在 org.bukkit.Bukkit.reload(Bukkit.java:535) [23:51:36 警告]:在 org.bukkit.command.defaults.ReloadCommand.execute(ReloadCommand.java:25) [23:51:36 警告]:在 org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:141) [23:51:36 警告]:在 org.bukkit.craftbukkit.v1_8_R3.CraftServer.dispatchCommand(CraftServer.java:641) [23:51:36 警告]:在 net.minecraft.server.v1_8_R3.PlayerConnection.handleCommand(PlayerConnection.java:1162) [23:51:36 警告]:在 net.minecraft.server.v1_8_R3.PlayerConnection.a(PlayerConnection.java:997) [23:51:36 警告]:在 net.minecraft.server.v1_8_R3.PacketPlayInChat.a(PacketPlayInChat.java:45) [23:51:36 警告]:在 net.minecraft.server.v1_8_R3.PacketPlayInChat.a(PacketPlayInChat.java:1) [23:51:36 警告]:在 net.minecraft.server.v1_8_R3.PlayerConnectionUtils$1.run(SourceFile:13) [23:51:36 警告]:在 java.util.concurrent.Executors$RunnableAdapter.call(未知来源) [23:51:36 警告]:在 java.util.concurrent.FutureTask.run(未知 来源)[23:51:36 警告]:在 net.minecraft.server.v1_8_R3.SystemUtils.a(源文件:44)[23:51:36 警告]:在 net.minecraft.server.v1_8_R3.MinecraftServer.B(MinecraftServer.java:715) [23:51:36 警告]:在 net.minecraft.server.v1_8_R3.DedicatedServer.B(DedicatedServer.java:374) [23:51:36 警告]:在 net.minecraft.server.v1_8_R3.MinecraftServer.A(MinecraftServer.java:654) [23:51:36 警告]:在 net.minecraft.server.v1_8_R3.MinecraftServer.run(MinecraftServer.java:557) [23:51:36 警告]:在 java.lang.Thread.run(未知来源)
【问题讨论】:
-
您能否提供适当的堆栈跟踪来检查来自 MySQL 的整个错误消息?
-
这是一个来自我的世界控制台的错误,即所有堆栈跟踪,实际上相同的错误显示了两次,第一次创建区域表,第二次创建位置表。查询似乎没问题,但可能我缺少一些东西