【问题标题】:Create Statement Returning ERROR: syntax error at or near "RETURNING"创建语句返回错误:“返回”处或附近的语法错误
【发布时间】:2019-07-02 19:28:15
【问题描述】:

我想用 CREATE 语句创建一个数据库表。我收到一个错误提示

Error: syntax error at or near "RETURNING". 

我了解 JDBC 驱动程序存在某种错误。正如我发现的那样。 Postgres JDBC driver: PSQLException: syntax error at or near RETURNING

看来我需要设置 Quirk Mode。但我不知道该怎么做。

现在我有

Connection dbConnection;
dbConnection = DriverManager.getConnection(connectionString,username,password);
Statement st = dbConnection.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
st.executeUpdate(query,Statement.RETURN_GENERATED_KEYS);

我不知道我应该在哪里设置怪癖模式

编辑:

我很抱歉遗漏了细节。它带我通过了引导的方式。

声明是通过

st.executeUpdate(query,Statement.RETURN_GENERATED_KEYS);

而SQL是

        String employeeTable="CREATE TABLE \"employee\" (\n" + 
                "   \"employee_id\" serial,\n" + 
                "   \"employee_first_name\" TEXT,\n" + 
                "   \"employee_middle_name\" TEXT,\n" + 
                "   \"employee_last_name\" TEXT,\n" + 
                "   \"employee_dob\" date ,\n" + 
                "   \"employee_ssn\" TEXT NOT NULL DEFAULT '0',\n" + 
                "   \"employee_wages\" FLOAT(30) NOT NULL DEFAULT '0',\n" + 
                "   \"employee_password\" TEXT DEFAULT '0',\n" + 
                "   \"employee_issupervisoer\" BOOLEAN NOT NULL DEFAULT 'false',\n" + 
                "   \"employee_hassupervisoer\" BOOLEAN NOT NULL DEFAULT 'false',\n" + 
                "   \"employee_supervisor_id\" integer,\n" + 
                "   \"employee_clockstatus\" BOOLEAN DEFAULT 'false',\n"+      // True = IN : False = OUT
                "   \"employee_lastpunch\" timestamp, \n"+
                "   \"employee_isactive\" BOOLEAN, \n"+
                "   CONSTRAINT employee_pk PRIMARY KEY (\"employee_id\")\n" + 
                ") WITH (\n" + 
                "  OIDS=FALSE\n" + 
                ");\n";

老实说,我认为 SQL 并不重要。大约 6 个月前,这个声明对我有用。我不知道发生了什么变化,但我从 Postgresql 9.4 更改为 10.7?无论最新的 10.x 稳定版是什么。我将我的 Gradle 更新为

// https://mvnrepository.com/artifact/org.postgresql/postgresql
compile group: 'org.postgresql', name: 'postgresql', version: '42.2.6'

【问题讨论】:

  • 查询结果是?
  • "CREATE query" 如果 SQL statementCREATE 语句,则它不是 query . SELECT 语句是 SQL Query。所有其他 SQL 语句都不是:语句。所以不要打电话给executeQuery,除非它是SELECT 声明。请改用executeUpdate。 --- 至于语法错误,当我们看不到正在执行的语句时,您认为我们如何帮助解决这个问题?
  • 没有语法错误。正如我所说,它是一个简单的 Create statement。如果您阅读了解我发布的链接的问题所在,它应该会给您一些更深入的了解。由于我不够清晰,我认为以一个更明确的问题为例
  • 我不是故意粗鲁,但你读过另一篇文章吗?有一个驱动问题,我不知道如何解决。驱动程序在我的 SQL 语句末尾盲目地添加“返回”。它本身不是我的代码,但是有一个解决这个错误的方法。
  • 不相关,但是:您不需要标识符周围的所有嵌入双引号。您可以删除它们并使您的 Java 代码更具可读性。

标签: java postgresql jdbc


【解决方案1】:

您不能将 CREATE TABLE 语句与 RETURNING 子句结合起来(因为它不会“返回”任何内容)。

当您调用executeUpdate(query,Statement.RETURN_GENERATED_KEYS) 时,您正在请求从 DML 语句中返回生成的密钥。 Postgres JDBC 驱动程序通过在查询中添加RETURNING 子句来实现这一点——这对于 DDL 语句显然没有意义。

请改用execute(query)

executeUpdate(query)(不请求生成的密钥)

【讨论】:

  • 感谢您花时间阅读问题和支持链接,并制定回答我的问题并解决我的问题的回复。我希望我能再给你投票 10 次
  • 从技术上讲,驱动程序应该支持它并将其作为正常语句处理。来自apidoc“如果 SQL 语句不是 INSERT 语句或能够返回自动生成的键的 SQL 语句(此类语句的列表是特定于供应商的),驱动程序将忽略该标志。” 因此,虽然您通常不会以这种方式执行 create table 语句,但驱动程序应该正确处理它。
猜你喜欢
  • 2016-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-11
  • 1970-01-01
  • 1970-01-01
  • 2023-02-02
相关资源
最近更新 更多