我如何更新 Postgres 中的一对多关系?
How I can update one to many relation in Postgres?
这是我的第一个 table 问题。
CREATE TABLE "question" (
"question_id" serial NOT NULL,
"question" TEXT NOT NULL UNIQUE,
"added_at" TIMESTAMP NOT NULL,
"question_marks" integer NOT NULL,
CONSTRAINT "question_pk" PRIMARY KEY ("question_id"))
问题有很多选项,所以我用 question_id
引用每个选项行
CREATE TABLE "option" (
"option_id" serial NOT NULL,
"option" TEXT NOT NULL,
"option_question_id" integer NOT NULL,
"option_correct" BOOLEAN NOT NULL,
CONSTRAINT "option_pk" PRIMARY KEY ("option_id"))
ALTER TABLE "option" ADD CONSTRAINT "option_fk1" FOREIGN KEY ("option_question_id") REFERENCES "question"("question_id") ON DELETE CASCADE;
现在,如何在一个查询中同时更新两个 table?
我正在建造 API。下面给出的输出是请求。该请求将以问题详细信息和问题选项作为响应。
我可以更新问题,但问题有很多选项,我该如何更新选项?
"questionDetails": [
{
"question_id": 30,
"question": "What is gravity of Saturn?",
"added_at": "2020-02-20T18:30:00.000Z",
"question_marks": 1
}
],
"options": [
{
"option_id": 19,
"option": "20",
"option_question_id": 30,
"option_correct": true
},
{
"option_id": 20,
"option": "30",
"option_question_id": 30,
"option_correct": false
},
{
"option_id": 21,
"option": "40",
"option_question_id": 30,
"option_correct": false
},
{
"option_id": 18,
"option": "400000000",
"option_question_id": 30,
"option_correct": false
}
]
}
现在我可以更新这个关系吗?
您可以使用具有返回子句的 CTE 在单个查询中将多个操作链接在一起。
with
__parent as(
update
my_schema.parent_table
set
col_1 = 'a',
col_2 = 'b'
where
id_col = 3
returning
id_col
)
update
my_schema.child_table
set
col_1 = 'c'
where
parent_id = (select id_col from __parent)
插入和删除语句可以做同样的事情。
请注意,您实际上需要在以下查询中从 CTE select,否则将不会执行其中的语句。
这是我的第一个 table 问题。
CREATE TABLE "question" (
"question_id" serial NOT NULL,
"question" TEXT NOT NULL UNIQUE,
"added_at" TIMESTAMP NOT NULL,
"question_marks" integer NOT NULL,
CONSTRAINT "question_pk" PRIMARY KEY ("question_id"))
问题有很多选项,所以我用 question_id
CREATE TABLE "option" (
"option_id" serial NOT NULL,
"option" TEXT NOT NULL,
"option_question_id" integer NOT NULL,
"option_correct" BOOLEAN NOT NULL,
CONSTRAINT "option_pk" PRIMARY KEY ("option_id"))
ALTER TABLE "option" ADD CONSTRAINT "option_fk1" FOREIGN KEY ("option_question_id") REFERENCES "question"("question_id") ON DELETE CASCADE;
现在,如何在一个查询中同时更新两个 table?
我正在建造 API。下面给出的输出是请求。该请求将以问题详细信息和问题选项作为响应。
我可以更新问题,但问题有很多选项,我该如何更新选项?
"questionDetails": [
{
"question_id": 30,
"question": "What is gravity of Saturn?",
"added_at": "2020-02-20T18:30:00.000Z",
"question_marks": 1
}
],
"options": [
{
"option_id": 19,
"option": "20",
"option_question_id": 30,
"option_correct": true
},
{
"option_id": 20,
"option": "30",
"option_question_id": 30,
"option_correct": false
},
{
"option_id": 21,
"option": "40",
"option_question_id": 30,
"option_correct": false
},
{
"option_id": 18,
"option": "400000000",
"option_question_id": 30,
"option_correct": false
}
]
}
现在我可以更新这个关系吗?
您可以使用具有返回子句的 CTE 在单个查询中将多个操作链接在一起。
with
__parent as(
update
my_schema.parent_table
set
col_1 = 'a',
col_2 = 'b'
where
id_col = 3
returning
id_col
)
update
my_schema.child_table
set
col_1 = 'c'
where
parent_id = (select id_col from __parent)
插入和删除语句可以做同样的事情。
请注意,您实际上需要在以下查询中从 CTE select,否则将不会执行其中的语句。