我正在尝试使用 Derby(SQL?)创建一个新表,但我不断收到错误消息,声称该表名称不是我表中的列名称。
列“CAR”不在 FROM 列表中的任何表中,或者出现在联接规范中但超出联接规范的范围,或者出现在 HAVING 子句中但不在 GROUP BY 列表中。如果这是 CREATE 或 ALTER TABLE 语句,则“CAR”不是目标表中的列。
每当我尝试运行此代码时就会发生这种情况:
private static final String DERBY_DRIVER = "org.apache.derby.jdbc.EmbeddedDriver";
public static final String JDBC_DERBYURL = "jdbc:derby:cars;create=true";
public CreateInventoryDB(){
try {
createDB();
} catch (ClassNotFoundException e) {
System.out.println("ClassNotFoundException: " + e);
} catch (SQLException e) {
System.out.println("SQLException: " + e.printStackTrace());
}
}
private void createDB() throws ClassNotFoundException, SQLException{
Class.forName(DERBY_DRIVER);
Connection connection = DriverManager.getConnection(JDBC_DERBYURL);
connection.createStatement().execute(
"create table cars(itemid int, type varchar(10), make varchar(10), " +
"model varchar(15), caryear int, startinventory varchar(10), " +
"datesold varchar(10), dealercost int, sellingprice int, doorwheels int)");
connection.createStatement().execute("insert into cars values " +
"(1, car, Ford, Crown_Victoria, 2010, 7/3/2012, 7/23/2012, 8900, 14000, 4),"+
//etc.
}
我假设它与插入汽车值
有关,因为这是我实际将信息放入表中的唯一位置,但我找不到任何其他位置四处寻找后可以做到这一点的方法。
最佳答案
您的值需要相应地引用...Derby 将 (1, car, Ford
视为文字,因此它看到 car
并看到,嘿,这是一个表...
简短的回答是做类似的事情
insert into cars values " +
"(1, 'car', 'Ford', 'Crown_Victoria', 2010, '7/3/2012', '7/23/2012', 8900, 14000, 4
例如...
更准确的答案是使用 PreparedStatement
这将有助于防止这种错误和其他注入(inject)错误,例如......
PreparedStatement ps = connection.prepareStatement("insert into cars values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
ps.setInt(1, 1);
ps.setString(2, "car");
ps.setString(3, "Ford");
ps.setString(4, "Crown_Victoria");
ps.setInt(5, 2010);
ps.setString(6, "7/3/2012");
ps.setString(7, "7/23/2012");
ps.setInt(8, 8900);
ps.setInt(9, 4);
如果您尝试在单个语句中添加多行,可以使用 addBatch
功能
关于java - 错误消息声称我的表名实际上是 Java Derby (SQL) 中的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24154615/