Как я могу обновить отношение один ко многим в Postgres? - PullRequest
0 голосов
/ 21 февраля 2020

Вот мой первый вопрос к таблице.

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
        }
    ]
}

Теперь я могу обновить это отношение?

1 Ответ

1 голос
/ 21 февраля 2020

Вы можете объединить несколько операций в один запрос, используя 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 в следующем запросе, иначе оператор внутри не будет выполнен.

...