1

我不断收到此错误,我一生都无法理解是什么原因造成的:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '= '111-11-1111'' at line 1

它被这些陈述抛出:

ps = conn.prepareStatement(
         "SELECT * FROM courses WHERE NOT EXISTS"
         + "(SELECT * FROM courses"
         + "NATURAL JOIN register"
         + "WHERE ssn = ?)")
ps.setString(1,ssn);

rs = ps.executeQuery();

我已经在 MySQl 命令行客户端中输入了这个确切的命令,一个字符一个字符(除了我用 '111-11-1111' 替换了?),它执行顺利。然而,当我尝试使用 Java 执行它时,它会因上述语法错误而失败。我有一个下沉的怀疑,答案是非常明显的,盯着我的脸,但我太累了,看不到它。有什么想法吗?

编辑 所以我解决了眼前的问题,但它只是提出了更多问题。如果我将查询构造为单行字符串而不是多行:

ps = conn.prepareStatement(
                "SELECT * FROM courses WHERE NOT EXISTS (SELECT * FROM courses NATURAL JOIN register WHERE ssn = ?)");

它执行得很好。(对不起水平滚动条,但在这种情况下我别无选择。)所以,我重新提出我的问题:为什么在 pony-loving-frack 中这会有所不同?我正在使用 Java 7、Netbeans 7.2 和 MySQL 5.5,如果这有什么不同的话。

4

3 回答 3

4

您正在使用连接创建一个字符串 - 尝试打印该字符串,您会看到问题......每个子字符串的开头或结尾没有任何空格,因此连接的字符串将是:

"SELECT * FROM courses WHERE NOT EXISTS(SELECT * FROM coursesNATURAL JOIN registerWHERE ssn = ?)"

所以coursesNATURALregisterWHERE将是糟糕的语法。

于 2012-10-06T04:26:35.917 回答
2

两者都是单行(第一次查询中也没有 \n / 换行符)

问题是在每行中断之间缺少空间,即在FROM courses你需要一个空间之后。

所以你的第一个查询实际上是错误的。因为它转换为:

 FROM **coursesNATURAL**
于 2012-10-06T04:25:58.963 回答
2

每当您在 JAVA 中创建跨越多行的字符串时,请确保在第一行之后或第二行之前留有空间

+ "(SELECT * FROM courses"
     + "NATURAL JOIN register"

这只会解决

SELECT * FROM coursesNATURAL JOIN register"
于 2012-10-06T04:33:01.767 回答