PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Erstellen einer PostgreSQL-Sequenz für ein Feld (das nicht die ID des Datensatzes ist)

Verwenden Sie CREATE SEQUENCE :

CREATE SEQUENCE scores_job_id_seq;  -- = default name for plain a serial

Fügen Sie dann einen Spaltenstandard zu scores.job_id hinzu :

ALTER TABLE scores ALTER COLUMN job_id SET DEFAULT nextval('scores_job_id_seq');

Wenn Sie binden möchten die Sequenz zur Spalte (so dass sie gelöscht wird, wenn die Spalte gelöscht wird), führen Sie auch aus:

ALTER SEQUENCE scores_job_id_seq OWNED BY scores.job_id;

All dies kann durch die Verwendung des Pseudo-Datentyps serial ersetzt werden für die Spalte job_id zu Beginn:

  • Tabellen sicher und sauber umbenennen, die serielle Primärschlüsselspalten in Postgres verwenden?

Wenn Ihre Tabelle bereits Zeilen enthält, möchten Sie vielleicht die SEQUENCE festlegen auf den nächsthöheren Wert und ergänzen Sie fehlende Serienwerte in der Tabelle:

SELECT setval('scores_job_id_seq', COALESCE(max(job_id), 1)) FROM scores;

Optional:

UPDATE scores
SET    job_id = nextval('scores_job_id_seq')
WHERE  job_id IS NULL;
  • Wie man eine Sequenz in PostgreSQL effizient auf verwendete und nicht verwendete Werte überprüft
  • Postgres ändert Sequenz manuell
  • Wie kann man die Primärschlüsselsequenz von Postgres zurücksetzen, wenn sie nicht mehr synchron ist?

Der einzige verbleibende Unterschied, eine serial Spalte ist auch auf NOT NULL gesetzt . Das können Sie auch wollen oder nicht:

ALTER TABLE scores ALTER COLUMN job_id SET NOT NULL;

Aber Sie können nicht ändern Sie einfach den Typ einer bestehenden integer :

ALTER TABLE scores ALTER job_id TYPE serial;

serial ist kein eigentlicher Datentyp. Es ist nur eine Notationsfunktion für CREATE TABLE .
Betrachten Sie in Postgres 10 oder höher eine IDENTITY Spalte:

  • Tabellenspalte automatisch erhöhen