sql >> Database >  >> RDS >> PostgreSQL

Werk het onderdeel (bestelnummer) bij dat de primaire sleutel is in Postgres

Ik zou een andere aanpak kiezen. In plaats van het onderdeelnummer aan te houden, houd je de bestelling van de onderdelen:

CREATE TABLE book_part (
   book_id bigint NOT NULL,
   part_order real NOT NULL,
   name text NOT NULL,
   PRIMARY KEY (book_id, part_order)
);

Het eerste deel dat wordt ingevoerd krijgt een part_order van 0,0. Als u een onderdeel aan het begin of het einde toevoegt, wijst u het gewoon toe aan part_order 1,0 minder of meer dan het vorige minimum of maximum. Als u een onderdeel tussen twee bestaande onderdelen invoegt, wijst u een part_order . toe dat is het rekenkundig gemiddelde van de aangrenzende delen.

Een voorbeeld:

-- 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');

Het werkelijke onderdeelnummer wordt berekend wanneer u de tabel opvraagt:

SELECT book_id,
       row_number() OVER (PARTITION BY book_id ORDER BY part_order) AS part,
       name
FROM book_part;

Het mooie hiervan is dat je niet veel rijen hoeft bij te werken wanneer je een onderdeel toevoegt of verwijdert.



  1. Genereer sql met subquery als een kolom in select-instructie met behulp van SQLAlchemy

  2. Hoe MySQL 8.0 te installeren op RHEL/CentOS 8/7 en Fedora 35

  3. Moet ik ontsnappen aan een verwachte integerwaarde met mysql_real_escape_string of kan ik gewoon (int)$expectedinteger gebruiken

  4. Voorkomt het gebruik van de WordPress get_results() databasefunctie sql-injectie?