错误的语法:"create schema"必须是批处理中仅有的语句。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了错误的语法:"create schema"必须是批处理中仅有的语句。相关的知识,希望对你有一定的参考价值。

参考技术A 你可以试试在建表的create之前,写一句go,就可以了

org.h2.jdbc.JdbcSQLSyntaxErrorException:SQL 语句“CREATE[*] SCHEMA DATABASE”中的语法错误; SQL 语句:

【中文标题】org.h2.jdbc.JdbcSQLSyntaxErrorException:SQL 语句“CREATE[*] SCHEMA DATABASE”中的语法错误; SQL 语句:【英文标题】:org.h2.jdbc.JdbcSQLSyntaxErrorException: Syntax error in SQL statement "CREATE[*] SCHEMA DATABASE "; SQL statement: 【发布时间】:2020-01-30 14:58:03 【问题描述】:

这里是主类:

public class Main 
// JDBC driver name and database URL
static final String JDBC_DRIVER = "org.h2.Driver";
static final String DB_URL = "jdbc:h2:mem:default";

//  Database credentials
static final String USER = "sa";
static final String PASS = "";



public static void main(String[] args) 
    Connection conn = null;
    Statement stmt = null;
    try 
        // STEP 1: Register JDBC driver
        Class.forName(JDBC_DRIVER);

        //STEP 2: Open a connection
        System.out.println("Connecting to database...");
        conn = DriverManager.getConnection(DB_URL, USER, PASS);

        //STEP 3: Execute a query
        ScriptRunner sr = new ScriptRunner(conn);
        //Creating a reader object
        Reader reader = new BufferedReader(new FileReader("C:\\PROJECTS\\src\\main\\resources\\createDatabaseAndUser.sql"));
        //Running the script
        sr.runScript(reader);


        // STEP 4: Clean-up environment

        conn.close();
     catch (SQLException se) 
        //Handle errors for JDBC
        se.printStackTrace();
     catch (Exception e) 
        //Handle errors for Class.forName
        e.printStackTrace();
     finally 
        //finally block used to close resources
        try 
            if (stmt != null) stmt.close();
         catch (SQLException se2) 
         // nothing we can do
        try 
            if (conn != null) conn.close();
         catch (SQLException se) 
            se.printStackTrace();
         //end finally try
     //end try
    System.out.println("Goodbye!");


createDatabaseAndUser.sql 文件位于资源文件夹中:

CREATE SCHEMA database;
CREATE USER ADMIN PASSWORD 'abc';

我正在尝试运行我的 SQL 脚本,但收到错误消息。

这里所有的输出:

Connecting to database...                                                                       
CREATE SCHEMA database

Error executing: CREATE SCHEMA database.Cause: org.h2.jdbc.JdbcSQLSyntaxErrorException: Syntax error
 in SQL statement "CREATE[*] SCHEMA DATABASE"; SQL statement:
CREATE USER ADMIN PASSWORD 'abc'                                                                
CREATE SCHEMA database      


[42000-199]
Goodbye!

我的 SQL 方言是 H2,我在 Intelij IDEA 中使用嵌入式 H2 数据库。

我刚开始学习 SQL 和 SQL 脚本,如果问题很愚蠢,请提前道歉。

【问题讨论】:

@Larnu 好的,当我将方言更改为 Postgres 并创建数据库名称时;我有同样的错误 @Larnu 好的,这是我关于服务器的错误。我用的是H2方言,怎么解决呢? 【参考方案1】:

您使用的工具的输出似乎以某种方式出现乱码。有CREATE[*] SCHEMA DATABASE 命令([*] 是 H2 的标记),但源 SQL 列为

CREATE USER ADMIN PASSWORD 'abc'                                                                
CREATE SCHEMA database

由于两个命令之间缺少分号,因此它是无效的。

两个地方应该相同([*] 标记除外)并且错误信息应该是

Syntax error in SQL statement "CREATE USER ADMIN PASSWORD 'abc'
CREATE[*] SCHEMA DATABASE "; SQL statement:
CREATE USER ADMIN PASSWORD 'abc'
CREATE SCHEMA database [42000-199]

所以您的源文件中缺少分号,或者此工具将其删除。其实不需要使用第三方工具,直接在H2中执行脚本即可:

Statement st = conn.createStatement();
st.execute("RUNSCRIPT FROM 'C:\\PROJECTS\\src\\main\\resources\\createDatabaseAndUser.sql'");

【讨论】:

以上是关于错误的语法:"create schema"必须是批处理中仅有的语句。的主要内容,如果未能解决你的问题,请参考以下文章

一般错误:Laravel 5.6.33 中的“)”附近的 1:语法错误“)

SQL 语句“CREATE TABLE TRIP...”中的语法错误

Amazon Redshift CREATE FUNCTION ERROR: 42601: 在“默认”或接近“默认”时出现语法错误

SQL 语句“CREATE EXTENSION[*] IF NOT EXISTS UUID_OSSP”中的语法错误

SQLServer 数据库提示“错误的语法:"XXXX"必须是批处理中仅有的语句 ”报错的原因分析

Php artisan migrate - 语法错误,意外''(T字符串)