Sql 从给出语法错误的多个插入开始

Sql 从给出语法错误的多个插入开始,sql,postgresql,Sql,Postgresql,我对SQL很陌生,一直被困在这个我一生都无法解决的小问题上 我要做的是:插入到表1中,然后在同一个数据库查询中插入到表2中 我有以下SQL语句: BEGIN TRANSACTION INSERT INTO "questionsGroup" DEFAULT VALUES; INSERT INTO questions (name, category, explanation, "belongsToGroup") VALUES ($1, $2, $3, last

我对SQL很陌生,一直被困在这个我一生都无法解决的小问题上

我要做的是:插入到表1中,然后在同一个数据库查询中插入到表2中

我有以下SQL语句:

BEGIN TRANSACTION
INSERT INTO "questionsGroup" DEFAULT VALUES;
INSERT INTO questions (name, category, explanation, "belongsToGroup") VALUES ($1, $2, $3, lastval('questionsGroup'));
END;
运行时,我遇到以下错误:

error: syntax error at or near "INSERT"
这是我如何调用查询的:

const response = await database.insertQuestionsIntoDatabase(query, ["cevin", 1, "test", 8]);
以及功能:

public async insertQuestionsIntoDatabase(sqlStatement: string, values: Array<string | number>): Promise<any> {
        console.log(sqlStatement);
        try {
            return await this.databaseClient.query(sqlStatement, values);
        } catch (e) {
            console.log(e);
            throw new Error("Something went wrong with DatabaseQueries Query")
        }
    }
公共异步insertquestionToDatabase(sqlStatement:string,values:Array):Promise{ log(sqlStatement); 试一试{ 返回wait this.databaseClient.query(sqlStatement,values); }捕获(e){ 控制台日志(e); 抛出新错误(“数据库查询出错”) } }
我错过了什么,很可能是一些琐碎的东西?谢谢。

您似乎只是想将
quationsGroup
id包含到
问题
表中。如果是这样,您可以在
CTE
中使用
insert

WITH qg AS (
       INSERT INTO questionsGroup
           DEFAULT VALUES
           RETURNING *
      )
INSERT INTO questions (name, category, explanation, belongsToGroup
    SELECT $1, $2, $3, qg.questionsGroupId
    FROM qg;

注:标识符使用双引号被认为不是一种好的做法。这只会使编写查询变得更加复杂。

您似乎只想将
quationsGroup
id包含到
qustions
表中。如果是这样,您可以在
CTE
中使用
insert

WITH qg AS (
       INSERT INTO questionsGroup
           DEFAULT VALUES
           RETURNING *
      )
INSERT INTO questions (name, category, explanation, belongsToGroup
    SELECT $1, $2, $3, qg.questionsGroupId
    FROM qg;

注:标识符使用双引号被认为不是一种好的做法。这只会使编写查询变得更加复杂。

在PostgreSQL文档中找到的语句示例:

BEGIN TRANSACTION
INSERT INTO "questionsGroup" DEFAULT VALUES;
INSERT INTO questions (name, category, explanation, "belongsToGroup") VALUES ($1, $2, $3, lastval('questionsGroup'));
END;
要开始事务块,请执行以下操作:

开始;
注意


以及启动和停止事务。它们不是结构构造。

示例可在PostgreSQL文档中找到:

BEGIN TRANSACTION
INSERT INTO "questionsGroup" DEFAULT VALUES;
INSERT INTO questions (name, category, explanation, "belongsToGroup") VALUES ($1, $2, $3, lastval('questionsGroup'));
END;
要开始事务块,请执行以下操作:

开始;
注意


以及启动和停止事务。它们不是结构构造。

不幸的是,如果我这样做,则会出现以下错误:错误:无法将多个命令插入到已准备好的statement@CevinThomas所以在两个不同的
PreparedStatement
对象上调用
executeUpdate()
,执行两条语句(尽管第一条语句可以是一条简单的
语句
)。不幸的是,如果这样做,则会出现以下错误:错误:无法将多个命令插入到一个准备好的语句中statement@CevinThomas所以通过在两个不同的
PreparedStatement
对象上调用
executeUpdate()
执行两条语句(尽管第一条语句可以是一条简单的
语句
)。是的,我见过人们使用这种所谓的CTE。我还没有研究过它,因此不熟悉语法,但我相信我会研究它。谢谢你的回复@那么你觉得这个答案有用吗?然后投票表决。我当然有。如果我们不得不使用双引号,因为我们的表名和表列都是pascal大小写,比如:“SalesOrders”。你对此有什么建议?我应该将名称转换为snake-case还是使用双引号,因为我知道PostgreSQL应用于表名和列名。@N.Dogac。可以使用双引号。博士后当然支持它。我建议不要使用它。Postgres标识符(遵循标准)不区分大小写,因此可以使用混合大小写——事实上,所有标识符在内部都转换为大写。是的,我见过人们使用这种所谓的CTE。我还没有研究过它,因此不熟悉语法,但我相信我会研究它。谢谢你的回复@那么你觉得这个答案有用吗?然后投票表决。我当然有。如果我们不得不使用双引号,因为我们的表名和表列都是pascal大小写,比如:“SalesOrders”。你对此有什么建议?我应该将名称转换为snake-case还是使用双引号,因为我知道PostgreSQL应用于表名和列名。@N.Dogac。可以使用双引号。博士后当然支持它。我建议不要使用它。Postgres标识符(遵循标准)不区分大小写,因此可以使用混合大小写——事实上,所有标识符在内部都转换为大写。