Sql 从给出语法错误的多个插入开始
我对SQL很陌生,一直被困在这个我一生都无法解决的小问题上 我要做的是:插入到表1中,然后在同一个数据库查询中插入到表2中 我有以下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
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标识符(遵循标准)不区分大小写,因此可以使用混合大小写——事实上,所有标识符在内部都转换为大写。