我有这个表格:
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有两个字段,所以我真的不明白这个错误。你们其中任何一个人都知道我在做什么吗?
答案 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
时应始终包含列列表。不要假设值的数量或顺序。在编写代码时,它可能对您有意义。两周之后你会做什么并不明显。阅读代码的任何人都没有意义。要明确。