Dadas as tabelas assim: https://dbfiddle.uk/Z8hOhnYG
CREATE TABLE accounts (
id bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
);
CREATE TABLE profiles (
id bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY
);
CREATE TABLE account_profiles (
id bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
account_id bigint NOT NULL REFERENCES accounts,
profile_id bigint NOT NULL REFERENCES profiles
);
Os requisitos são:
- cada conta deve sempre ter pelo menos um perfil vinculado a ela.
- portanto, uma nova conta deve sempre criar um novo perfil e adicionar sua linha de relação ao banco de dados
- nada é criado quando toda a operação falha por qualquer motivo.
Portanto, para fins de lote, gostaria de escrevê-lo como uma consulta de várias inserções e criei este algoritmo:
- crie uma série de IDs com o mesmo comprimento que o número de contas
- adicionar contas
- juntar novas contas com a série
- adicionar perfis
- juntar novos perfis com a série
- junte as tabelas de séries de conta e perfil em seu id de série e insira o resultado na tabela de relações
- devolver novas contas
Você vai ter que fazer
insert
-returning
ou usarlastval()
Depois de alguma discussão chegamos a isso:
Aqui estou usando a função window
row_bnumber() over ()
para atribuir números de linha a cada nova linha inserida, fornecendo um número no qual elas podem ser unidas no conjunto de resultados final.