SQL未将文件内容添加到表

时间:2018-10-14 19:29:51

标签: java sql apache derby

当前,我正在尝试通过Apache Derby将新数据传递到SQL表。我将从具有给定文本的文件中读取内容,并将每个读取的令牌添加到其各自的列中。

但是,在尝试执行此操作时,我收到无数错误,表明令牌不是列...但这不是我要执行的操作。

carmpg.txt内容:

Toyota Prius 52 23475 Kia Optima 31 22600 Hyundai Sonata 31 22050 Nissan Altima 31 23260 Chevrolet Malibu 30 21680 Honda Accord 30 23570 Mazda 6 29 21945 Subaru Legacy 29 22195 Toyota Camry 27 23495 Chrysler 200 27 22115 Ford Fusion 27 22120 Volkswagen Passat 27 22995 Volkswagen CC 25 34475 Chevrolet Impala 25 27895 Buick LaCrosse 25 29565 Nissan Maxima 25 33270 Buick Regal 24 27065 Lincoln MKZ 26 3560

因此,Toyota应该进入Manufacturer列,Prius应该进入Model列,依此类推。

这是代码:

 try(Connection conn = SimpleDataSource.getConnection();Statement stat = 
conn.createStatement()) 
  {
     try
     {
        stat.execute("DROP TABLE Car");
     }
     catch(SQLException e)
     {
         // get exception if table doesn't exist yet
     }

     stat.execute("CREATE TABLE Car (Manufacturer VARCHAR(20),"
           + "Model VARCHAR(20), " + "Efficiency DECIMAL(6,2), " + "Price DECIMAL(8,2)) ");


     String inputFileName = "carmpg.txt";
     File inputFile = new File(inputFileName);
     Scanner in = new Scanner(inputFile);

     // COMPLETE THIS WHILE LOOP to insert all cars from the input text file
     while (in.hasNextLine()){

         stat.execute("INSERT INTO Car VALUES " + in.next());


     }

     ResultSet rs = stat.executeQuery("SELECT * FROM Car");
     rs.next();
     System.out.println(rs.getString("Model"));

以及相关的堆栈跟踪:

Exception in thread "main" java.sql.SQLSyntaxErrorException: Column 'TOYOTA' 
is either not in any table in the FROM list or appears within a join 
specification and is outside the scope of the join specification or appears 
in a HAVING clause and is not in the GROUP BY list. If this is a CREATE or 
ALTER TABLE  statement then 'TOYOTA' is not a column in the target table.
at org.apache.derby.impl.jdbc.SQLExceptionFactory.getSQLException(Unknown 
Source)
at org.apache.derby.impl.jdbc.Util.generateCsSQLException(Unknown Source)
at 
org.apache.derby.impl.jdbc.TransactionResourceImpl.wrapInSQLException(Unknown 
Source)
at org.apache.derby.impl.jdbc.TransactionResourceImpl.handleException(Unknown 
Source)
at org.apache.derby.impl.jdbc.EmbedConnection.handleException(Unknown Source)
at org.apache.derby.impl.jdbc.ConnectionChild.handleException(Unknown Source)
at org.apache.derby.impl.jdbc.EmbedStatement.execute(Unknown Source)
at org.apache.derby.impl.jdbc.EmbedStatement.execute(Unknown Source)
at CarDB.main(CarDB.java:49)
Caused by: ERROR 42X04: Column 'TOYOTA' is either not in any table in the 
FROM list or appears within a join specification and is outside the scope of 
the join specification or appears in a HAVING clause and is not in the GROUP 
BY list. If this is a CREATE or ALTER TABLE  statement then 'TOYOTA' is not a 
column in the target table.
at org.apache.derby.iapi.error.StandardException.newException(Unknown Source)
at org.apache.derby.iapi.error.StandardException.newException(Unknown Source)
at org.apache.derby.impl.sql.compile.ColumnReference.bindExpression(Unknown 
Source)
at org.apache.derby.impl.sql.compile.ColumnReference.bindExpression(Unknown 
Source)
at org.apache.derby.impl.sql.compile.ResultColumn.bindExpression(Unknown 
Source)
at org.apache.derby.impl.sql.compile.ResultColumnList.bindExpressions(Unknown 
Source)
at org.apache.derby.impl.sql.compile.RowResultSetNode.bindExpressions(Unknown 
Source)
at org.apache.derby.impl.sql.compile.DMLStatementNode.bindExpressions(Unknown 
Source)
at org.apache.derby.impl.sql.compile.InsertNode.bindStatement(Unknown Source)
at org.apache.derby.impl.sql.GenericStatement.prepMinion(Unknown Source)
at org.apache.derby.impl.sql.GenericStatement.prepare(Unknown Source)
at 

org.apache.derby.impl.sql.conn.GenericLanguageConnectionContext.prepareInternalStatement(Unknown Source) ... 3 more

感谢您的帮助

1 个答案:

答案 0 :(得分:4)

INSERT INTO语句的语法为:

INSERT INTO table_name (column1, column2, column3, ...)
VALUES (value1, value2, value3, ...);

同样,您的错误是您尝试从文本文件中插入整行而不将其拆分为代表4个不同列的4个部分。
由于尝试执行以下无效语句而触发了您得到的错误:

INSERT INTO Car VALUES Toyota Prius   52  23475

应该是

INSERT INTO Car (Manufacturer, Model, Efficiency, Price) VALUES ('Toyota', 'Prius', 52, 23475)