【问题标题】:MySQLSyntaxErrorException: Unknown column ' ____ ' in 'field list'MySQLSyntaxErrorException:“字段列表”中的未知列“____”
【发布时间】:2011-07-27 08:21:42
【问题描述】:

我得到以下 MySQL 异常:

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:“字段列表”中的未知列“book.call_Number”。

这是什么意思,我该如何解决?

这是导致此异常的代码:

public void actionPerformed(ActionEvent e) {
    list.clearSelection();

    String selectString = " ";
    String afName = auth_fName.getText();
    String aMI = auth_MI.getText();
    String alName = auth_lName.getText();
    String tField = titleField.getText();
    String sField = subjectField.getText();

    try {
        Connection conn = Database.getConnection();

        Statement s = conn.createStatement();

        if (!afName.equals("") && (!aMI.equals("")) && (!alName.equals("")) && (!tField.equals("")) && (!sField.equals(""))) {
            selectString = "SELECT a.call_Number as callNbr "
                + "FROM book a "
                + "FULL JOIN transaction b "
                + "ON a.call_Number=b.call_Number";
        }

        s = conn.createStatement();
        System.out.println(selectString);
        ResultSet rs = s.executeQuery(selectString);

        while (rs.next()) {
            String call_Num = rs.getString("call_Number");
            String title = rs.getString("title");
            String auth_lName = rs.getString("auth_lName");
            String auth_MI = rs.getString ("auth_MI");
            String auth_fName = rs.getString("auth_fName");
            String availability = rs.getString("availability");

            view = new View(call_Num, title, auth_lName, auth_MI, auth_fName, availability);
            vList.add(view);
            System.out.println(view);
        }

        rs.close();
        s.close();
        conn.close();

        list.setListData(vList.toArray());
    } catch (Exception ex) {
        ex.printStackTrace();
    }
}

这里是 DDL 和内容:

s.executeUpdate (
    "CREATE TABLE book ("
    + "call_Number CHAR(10),"
    + "PRIMARY KEY (call_Number),"
    + "auth_fName CHAR(30)NOT NULL, auth_MI CHAR(2),"
    + "auth_lName CHAR(50)NOT NULL, title CHAR(100) NOT NULL,"
    + "subject CHAR(30) NOT NULL)");
count = s.executeUpdate (
    "INSERT INTO book"
    + " VALUES"
    + "('MY.111.000', 'Mark', 'M','Bradshaw','Mystery Under the Sun','mystery'),"
    + "('MY.111.001', 'Mark','','Twain','The Adventures of Huckleberry Finn','mystery'),"
    + "('SF.111.002', 'Kito', 'M','Bradford','Mr. Roboto','science fiction'),"
    + "('SF.111.003', 'Eric','','Laslow','Science Fiction - Can It Happen?','science fiction'),"
    + "('AV.111.004', 'Rashad','','Cheeks','Fire Under the Bridge','adventure'),"
    + "('AV.111.005', 'Samantha','A','Appleby','The Open Sea','adventure'),"
    + "('CO.111.006', 'Lindsey', '','Butterby','What? We cant spend anymore!?','comedy'),"
    + "('CO.111.007', 'Judy', 'S','Yates','So this is life?','comedy'),"
    + "('IN.111.008', 'Elizabeth', 'J','Lee','Mystery Under the Sun','international'),"
    + "('IN.111.009', 'Gabriella', 'M','Rodriguez','Love in Brazil','international')");

*******t_action 表**** *************** ********

  //create transaction table
        s.executeUpdate (
            "CREATE TABLE t_action ("
            + "patron_ID CHAR(10) NOT NULL,"
            + "call_Number CHAR(10) NOT NULL, check_Out_Date DATE NOT NULL, check_In_Date DATE NOT NULL,"
            + "PRIMARY KEY (patron_ID, call_Number),"
            + "avail CHAR(15), total_Charge FLOAT)");

        count3 = s.executeUpdate (
            "INSERT INTO t_action"
            + " VALUES"
            + "('P222200000','MY.111.000','2011-03-08','2011-03-15','AVAILABLE',5.00),"
            + "('P222200001','MY.111.001','2011-03-31','2011-04-6','DUE 2011-04-6',5.00),"
            + "('P222200002','SF.111.002','2011-03-30','2011-04-5','DUE 2011-04-5',5.00),"
            + "('P222200003','SF.111.003','2011-03-29','2011-04-4','DUE 2011-04-4',5.00),"
            + "('P222200004','AV.111.004','2011-03-28','2011-04-3','DUE 2011-04-3',5.00),"
            + "('P222200005','AV.111.005','2011-03-27','2011-04-2','DUE 2011-04-2',5.00),"
            + "('P222200006','CO.111.006','2011-03-26','2011-04-1','DUE 2011-04-1',5.00),"
            + "('P222200007','CO.111.007','2011-01-06','2011-01-12','AVAILABLE',5.00),"
            + "('P222200008','IN.111.008','2011-02-06','2011-02-12','AVAILABLE',5.00),"
            + "('P222200009','IN.111.009','2011-03-06','2011-03-12','AVAILABLE',5.00)");

【问题讨论】:

    标签: java mysql jdbc


    【解决方案1】:

    使用<column> as 谓词,如下所示:-

    selectString = "SELECT a.call_Number as callNbr, ... " + "FROM book a" + "FULL JOIN transaction b" + "ON a.call_Number=b.call_Number";

    然后改代码寻找callNbr:-

    String call_Num = rs.getString("callNbr");

    HTH。

    【讨论】:

    • 哈哈哈哈!当我取出别名并只做 call_Number 时,我得到: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Column 'call_Number' in field list is ambiguous 。 . .掉头发要拔:)
    • 好吧,这意味着 call_Number 列在两个表中,我应该从您的加入中注意到。我的错!您能否尝试将列名作为SELECT call_Number as callNbr 之类的方法?
    • 当我这样做时,我再次得到这个:com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException:字段列表中的列“call_Number”不明确。 . .我会用修改后的电话更新我的帖子,以确保我做得对。
    • 我以为我做到了?我输入为:selectString = "SELECT call_Number as callNbr, title, auth_lName, auth_fName, auth_MI, transaction.availability" + "FROM book" + "FULL JOIN transaction" + "ON book.call_Number=transaction.call_Number";跨度>
    • 仔细检查我发布的原始代码。我对其进行了编辑以显示修改后的代码以及您对变量 callNbr 的建议。我是否按照您的预期实现了它?
    【解决方案2】:

    将您的查询更改为:

        selectString = "SELECT a.call_Number "
            + "FROM book a "
            + "INNER JOIN transaction b "
            + "ON a.call_Number=b.call_Number";
    

    MySQL 不支持FULL OUTER JOIN。如果您真的需要这种效果 - 您需要使用 UNION 进行 2 次选择。虽然从外观上看 - 似乎没有必要。

    【讨论】:

    • 好吧,当我听从你的建议时,它起作用了……当我删除 transaction.availability。那么我怎样才能让它在事务表中也能正常工作。我将可用性列修改为“avail”,将事务表修改为“t_action”。现在我有了代码:selectString = "SELECT a.call_Number, title, auth_lName, auth_fName, auth_MI, b.t_action.avail "+" FROM book a " + "INNER JOIN t_action b "+ "ON a.call_Number=b.call_Number";当然,每当我输入它时,它都会给我一个非常熟悉的错误:“字段列表”中的未知列“b.t_action.avail”。任何想法如何绕过它?
    • 另外,我只希望它选择我搜索的特定记录?我是否使用正确的 mySQL 命令来执行此操作?我从大部分 book 表中获取值,并将它们组合到 t_action 表中的值。那正确吗?我试图避免冗余。 . .
    • 这是不正确的。应该是b.avail 而不是b.t_action.avail
    • @Mike - 我会按照你的要求这样写 SQL - "SELECT <your_columns> " + "FROM book a,transaction b " + "WHERE a.call_Number=b.call_Number";
    • 这就是我最初在没有很酷的“a”和“b”的情况下所做的。好吧,它现在可以工作了;但是,它会为表中的所有项目打印出指定列的内容。它不止一个值。有任何想法吗?我正在使用您上面指定的语句: selectString = "a.call_Number, title, auth_lName, auth_fName, auth_MI, b.avail " + "FROM book a,t_action b " + "WHERE a.call_Number=b.call_Number";
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-27
    • 2017-06-27
    • 1970-01-01
    • 1970-01-01
    • 2016-10-07
    • 2014-03-19
    • 2014-07-19
    相关资源
    最近更新 更多