列的索引超出范围:2,列数1

时间:2015-06-14 11:28:03

标签: java sql

我有这个表格:

Klas_student

CREATE TABLE IF NOT EXISTS Klas_student(
Student varchar(7) REFERENCES studenten (Studentenummer) ON DELETE CASCADE NOT NULL,
Klas text NOT NULL REFERENCES Klas (Naam_id) ON DELETE CASCADE NOT NULL
);

在这个表格中,我想添加值,我这样用预备语句这样做。

PreparedStatement studentToKlas = conn.prepareStatement("INSERT INTO Klas_student " + "VALUES (?)");
                studentToKlas.setString(1, studentnummer);
                studentToKlas.setString(2, klasIdToInsert);

但是这个错误不断出现:

org.postgresql.util.PSQLException: L'indice de la colonne est hors limite : 2, nombre de colonnes : 1.
at org.postgresql.core.v3.SimpleParameterList.bind(SimpleParameterList.java:56)
at org.postgresql.core.v3.SimpleParameterList.setStringParameter(SimpleParameterList.java:118)
at org.postgresql.jdbc2.AbstractJdbc2Statement.bindString(AbstractJdbc2Statement.java:2304)
at org.postgresql.jdbc2.AbstractJdbc2Statement.setString(AbstractJdbc2Statement.java:1392)
at org.postgresql.jdbc2.AbstractJdbc2Statement.setString(AbstractJdbc2Statement.java:1374)
at PerformanceClass$1.run(PerformanceClass.java:73)
at java.lang.Thread.run(Thread.java:724)

它基本上表示列的索引超出限制:2,列数为1。

PerformanceClass.java:73是这行代码:

 studentToKlas.setString(2, klasIdToInsert);

正如你所看到的,Klas_student有两个字段,所以我真的不明白这个错误。你们其中任何一个人都知道我在做什么吗?

3 个答案:

答案 0 :(得分:2)

您有两列,因此您的陈述应为:

"INSERT INTO Klas_student VALUES (?, ?)")

即。它应该包含两个占位符,每列一个。

答案 1 :(得分:1)

这是因为你在这里只绑定了一个参数:

("INSERT INTO Klas_student " + "VALUES (?)")

将其更改为:

 ("INSERT INTO Klas_student " + "VALUES (?,?)")

答案 2 :(得分:1)

这是你的陈述:

INSERT INTO Klas_student " + "VALUES (?)

Klas_student有两列。所以,这相当于:

INSERT INTO Klas_student(Student, Klas) " + "VALUES (?)

现在,您可以清楚地看到错误是什么。有两列,您正在插入一列。在您的情况下,两列都不是NULL,因此您需要输入两个值:

INSERT INTO Klas_student(Student, Klas) " + "VALUES (?, ?)

我添加答案的原因是,强调在执行INSERT时应始终包含列列表。不要假设值的数量或顺序。在编写代码时,它可能对您有意义。两周之后你会做什么并不明显。阅读代码的任何人都没有意义。要明确。