【问题标题】:SQL Exception:can not create table [duplicate]SQL异常:无法创建表[重复]
【发布时间】:2015-09-29 08:59:26
【问题描述】:

当我运行代码时,会出现此错误

Exception in thread "main" java.sql.SQLException: Can't create table 'Sensors_db.one' (errno: 121)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1073)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3609)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3541)
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2002)
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2163)
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2624)
    at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2127)
    at com.mysql.jdbc.PreparedStatement.execute(PreparedStatement.java:1362)
    at sensordev.SensorDev.sensorPage(SensorDev.java:283)
    at sensordev.SensorDev.main(SensorDev.java:893)

以下是我的代码

String type = "37";
        String senName = "one";
        String query;
        switch(type){
            case "37":{

                query = "CREATE TABLE IF NOT EXISTS `"+ senName +"` ("
                        + "  `Name` VARCHAR(45) NOT NULL,"
                        + "  `State` VARCHAR(45) NOT NULL,"
                        + "  `Time` TIME NOT NULL,"
                        + "  PRIMARY KEY (`Time`, `State`),"
                        + "  INDEX `fk_dummy_1_idx` (`Name` ASC),"
                        + "  CONSTRAINT `fk_dummy_1`"
                        + "    FOREIGN KEY (`Name`)"
                        + "    REFERENCES `Sensors_db`.`sensorInfo` (`SName`)"
                        + "    ON DELETE NO ACTION"
                        + "    ON UPDATE NO ACTION);";
                defaultStmt = conn.prepareStatement(query);
                 defaultStmt.execute();

'conn' 是我的数据库实例,'defaultStmt' 是 PreparedStatement

【问题讨论】:

  • 您遇到了 SQL 错误,您可能会在异常堆栈跟踪中进一步了解更多信息。无论如何,我建议您直接在 ddbb 中尝试查询。希望对你有帮助
  • 如果您看到“基本错误文本”和一些错误编号“(errno: 121)”,那么最好的下一步是用谷歌搜索该数字的含义
  • 非常感谢....@Vovka

标签: java mysql jdbc sqlexception


【解决方案1】:

err 121 表示约束名称已被使用。更改您的约束名称。约束名称在您的数据库中应该是唯一的。

查看约束是否已经存在。

SELECT
    table_name
FROM
    information_schema.table_constraints
WHERE
    constraint_type = 'FOREIGN KEY'
    AND table_schema = DATABASE() AND
    constraint_name = 'fk_dummy_1'

【讨论】:

    【解决方案2】:

    fk_dummy_1 已经存在于数据库中

    更改约束名称

    "fk_dummy_1" to senName+"fk_dummy_1"
    

    【讨论】:

      【解决方案3】:

      将最后一条语句改为:defaultStmt.executeUpdate();

      【讨论】:

        猜你喜欢
        • 2015-02-04
        • 2018-08-15
        • 2020-04-18
        • 1970-01-01
        • 1970-01-01
        • 2014-08-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多