sql >> Databáze >  >> RDS >> PostgreSQL

Sériová čísla na skupinu řádků pro složený klíč

ne. Bylo to mnohokrát vyzkoušeno a je to utrpení.

Použijte obyčejný serial nebo IDENTITY sloupec:

  • Automaticky zvyšovat sloupec tabulky
CREATE TABLE address_history (
  address_history_id serial PRIMARY KEY
, person_id int NOT NULL REFERENCES people(id)
, created_at timestamp NOT NULL DEFAULT current_timestamp
, previous_address text
);

Použijte funkci okna row_number() získat sériová čísla bez mezer na person_id . Můžete přetrvat VIEW kterou můžete použít jako náhradu za vaši tabulku v dotazech, abyste měli tato čísla připravena:

CREATE VIEW address_history_nr AS
SELECT *, row_number() OVER (PARTITION BY person_id
                             ORDER BY address_history_id) AS adr_nr
FROM   address_history;

Viz:

  • Posloupnost bez mezer, kde je zapojeno více transakcí s více tabulkami

Nebo můžete chtít ORDER BY něco jiného. Možná created_at ? Lepší created_at, address_history_id přerušit případné vazby. Související odpověď:

  • Sloupec s alternativními seriály

Také typ dat, který hledáte, je timestamp nebo timestamptz , nikoli datetime v Postgres:

  • Úplné ignorování časových pásem v Rails a PostgreSQL

A stačí uložit previous_address (nebo více podrobností), nikoli address ani original_address . Obojí by bylo v rozumném datovém modelu nadbytečné.




  1. Výzva je spuštěna! Výzva komunity k vytvoření nejrychlejšího generátoru číselných řad

  2. Zaznamenejte změny záznamu na serveru SQL do auditní tabulky

  3. Rozdělit hodnoty do více řádků

  4. Jak používat EXISTS Logical Operator v SQL Server - SQL Server / TSQL výukový program, část 125