【问题标题】:How I can update one to many relation in Postgres?如何在 Postgres 中更新一对多关系?
【发布时间】:2020-02-21 10:54:08
【问题描述】:

这是我的第一个表格问题。

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;

现在,如何在一个查询中更新两个表?

我正在构建一个 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
        }
    ]
}

现在我可以更新这个关系吗?

【问题讨论】:

  • 您需要说明您希望如何更新表格。样本数据和期望的结果会有所帮助。

标签: sql database postgresql database-design


【解决方案1】:

您可以使用具有返回子句的 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 中进行选择,否则将不会执行其中的语句。

【讨论】:

    猜你喜欢
    • 2022-01-23
    • 1970-01-01
    • 2013-07-12
    • 2023-03-29
    • 2018-01-28
    • 1970-01-01
    • 1970-01-01
    • 2018-05-14
    • 2013-11-20
    相关资源
    最近更新 更多