使用preparedStatement设置mysql主键字段时出错

时间:2011-12-08 17:48:33

标签: java mysql

这是我插入行的代码。列是:主要ID,名称和艺术家。

我是否正确传递了主要ID,因为它一直在给我一个错误?它被设置为1,并且每次添加行时它都会递增。

try {
    //Database
    String query = "INSERT INTO lyrics1(lyrics1_id, name, artist) values(?, ?, ?)";
    PreparedStatement statement = connection.prepareStatement(query);
    statement.setString(2, nameOfSong.getText()); // set input parameter 2
    statement.setString(3, artist.getText()); 
    statement.setLong(i, i);
    ResultSet rs = statement.executeQuery("SELECT * FROM lyrics1");
    while (rs.next()){
        System.out.println(rs.getString(1));
    }
    statement.execute();
    rs.close();
    statement.close();
    connection.close();
    i++;

} catch (SQLException insertException) {
    displaySQLError(insertException);
}

错误是:

SQLException: No value specified for parameter 1 SQLState: 07001 VendorError: 0 

6 个答案:

答案 0 :(得分:4)

如果你的主键是AUTO_INCREMENT,它听起来就是这样,你没有用INSERT语句传递它,它会自动为你处理。这就是你想要做的事情:

INSERT INTO lyrics1(name, artist)
VALUES(?, ?)

答案 1 :(得分:3)

(这假设您的主键不是 AUTO_INCREMENT,并且您出于某种原因正在传递它。)

我认为你有一个简单的拼写错误:

statement.setLong(i, i);

应该是

statement.setLong(1, i);
//                ^-- 1, not i

作为一个老傻瓜,我也可能会将这个陈述高于其他两个,所以你要按顺序进行。

答案 2 :(得分:2)

如果您在主键中有自动增量:

String query = "INSERT INTO lyrics1(name, artist) values(?, ?)";

答案 3 :(得分:0)

在插入TEXT或VARCHAR值时不要忘记添加引号,例如“INSERT INTO lyrics1(lyrics1_id,name,artist)VALUES(”id“,”name“,”artist“)。

此外,如果密钥是自动增量的,请不要传递它,SQL将自行完成。然后查询应该是“INSERT INTO lyrics1(name,artist)VALUES(”name“,”artist“)。”

答案 4 :(得分:0)

据我所知,你应该有一个;在最后的字符串中如下:

String query =“INSERT INTO lyrics1(lyrics1_id,name,artist)values(?,?,?)”;

然而,无论如何它都可能有效。

答案 5 :(得分:0)

您在为主键设置值的行上有拼写错误:

statement.setLong(i, i);

在这里,您是否看到了第一个参数,它是i而不是1。所以必须改为

statement.setLong(1, i);

但是,如果您再次运行该程序,如果i的值初始化为常量,则会出现主键违例异常。因为,您正在使用MySQL,并且如果您使用AUTO_INCREMENT作为主键列,那么您可以在INSERT查询中避免使用该字段。 MySQL将自动为该字段分配值。所以你可以使用这样的东西:

INSERT INTO lyrics1(name, artist) values(?, ?)