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

Spalte für automatisches Inkrement zu vorhandener, nach Datum geordneter Tabelle hinzufügen

Wenn Sie eine solche serielle Spalte hinzufügen, werden die vorhandenen Zeilen automatisch in einer "willkürlichen" Reihenfolge aktualisiert.

Um die Reihenfolge zu steuern, in der die IDs generiert werden, müssen Sie dies in mehreren Schritten tun:

Fügen Sie zuerst die Spalte ohne hinzu ein Standard (serial impliziert einen Standardwert)

ALTER TABLE tickets ADD COLUMN ticket_id integer;

Erstellen Sie dann eine Sequenz, um die Werte zu generieren:

create sequence tickets_ticket_id_seq;

Aktualisieren Sie dann die vorhandenen Zeilen

update tickets 
  set ticket_id = t.new_id
from (
   select id, nextval('tickets_ticket_id_seq') as new_id
   from tickets
   order by "date"
) t
where t.id = tickets.id;

Machen Sie dann die Sequenz zum Standard für die neue Spalte

alter table tickets alter column ticket_id set default nextval('tickets_ticket_id_seq');

Verknüpfen Sie schließlich die Sequenz mit der Spalte (was eine serial auch im Hintergrund):

alter sequence tickets_ticket_id_seq owned by tickets.ticket_id;

Wenn die Tabelle wirklich groß ist ("Zehner" oder "Hunderte" von Millionen), dann kann das Erstellen einer neuen Tabelle schneller sein:

create sequence tickets_ticket_id_seq;
create table tickets_new
as
select id, nextval('activities_ticket_id_seq') ticket_id, "date", status
from tickets
order by "date";

drop table tickets cascade;
alter table tickets_new rename to tickets;
alter table tickets add primary key (id);
alter sequence tickets_ticket_id_seq owned by tickets.ticket_id;

Erstellen Sie dann alle Fremdschlüssel und Indizes für diese Tabelle neu.