PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Atualizar peça (número do pedido) que é chave primária no Postgres


Eu escolheria uma abordagem diferente. Em vez de persistir o número da peça, persista o pedido das peças:
CREATE TABLE book_part (
   book_id bigint NOT NULL,
   part_order real NOT NULL,
   name text NOT NULL,
   PRIMARY KEY (book_id, part_order)
);

A primeira parte inserida recebe um part_order de 0,0. Se você adicionar uma parte no início ou no final, basta atribuir a part_order 1,0 a menos ou mais do que o mínimo ou máximo anterior. Se você inserir uma peça entre duas peças existentes, você atribui um part_order que é a média aritmética das partes adjacentes.

Um exemplo:
-- insert the first part

INSERT INTO book_part VALUES (1, 0.0, 'Introduction');

-- insert a part at the end

INSERT INTO book_part VALUES (1, 1.0, 'Getting started with PostgreSQL');

-- insert a part between the two existing parts

INSERT INTO book_part VALUES (1, 0.5, 'The history of PostgreSQL');

-- adding yet another part between two existing parts

INSERT INTO book_part VALUES (1, 0.25, 'An introductory example');

O número de peça real é calculado quando você consulta a tabela:
SELECT book_id,
       row_number() OVER (PARTITION BY book_id ORDER BY part_order) AS part,
       name
FROM book_part;

A beleza disso é que você não precisa atualizar muitas linhas ao adicionar ou excluir uma parte.