Я нашел миллион вещей, похожих на StackOverflow, но не совсем в моем случае. Я максимально упрощу:
У меня есть две таблицы следующим образом:
CREATE TABLE B (id uuid PRIMARY KEY);
CREATE TABLE A (id uuid PRIMARY KEY, b_id uuid REFERENCES b);
Есть некоторые NULL
значения в A.b_id
. Я пытаюсь создать миграцию, которая делает следующее:
Для каждой строки в A
без no b_id
создайте новую строку в B
и назначьте id
ее A.b_id
.
Как я могу сделать это в одном запросе?
Решение проблемы
Предполагая, что вам нужна отдельная запись b
для каждой строки с отсутствующим UUID в a
:
WITH upd AS (
UPDATE a
SET b_id = gen_random_uuid()
WHERE b_id IS NULL
RETURNING b_id
)
INSERT INTO b (id)
SELECT b_id FROM upd;
db<>скрипка здесь
Это работает, потому что это одна команда, а ссылка FK применяется только в конце команды.
Видеть:
- SET CONSTRAINTS ALL DEFERRED не работает должным образом
- Определенное ограничение DEFERRABLE INITIALLY IMMEDIATE по-прежнему ОТЛОЖЕНО?
Комментариев нет:
Отправить комментарий