it-swarm.com.de

Ändern Sie den Datentyp einer Spalte in seriell

In pgsql gibt es eine Möglichkeit, eine Tabelle mit mehreren Werten zu erstellen. Wählen Sie einen dieser Werte aus (beispielsweise other_id), ermitteln Sie den höchsten Wert und stellen Sie fest, dass jeder neue Eintrag, der in die Tabelle eingefügt wird, diesen Wert erhöht.

Ich nehme an, das war einfach zu einfach, um arbeiten zu können.

ALTER TABLE address ALTER COLUMN new_id TYPE SERIAL

____________________________________ 
ERROR:  type "serial" does not exist

Vielen Dank für jeden Einblick!

24
1252748

Ein kurzer Blick auf die docs sagt Ihnen das

Die Datentypen smallserial serial und bigserial sind keine wahren Typen , sondern nur Eine praktische Notation zum Erstellen eindeutiger Bezeichnerspalten

Wenn Sie möchten, dass eine vorhandene (Ganzzahl-) Spalte als "serielle" Spalte fungiert, erstellen Sie die Sequenz einfach von Hand (der Name ist willkürlich), und stellen Sie den aktuellen Wert auf das Maximum (oder höher) Ihres aktuellen Werts für address.new_id unter ein Legen Sie ihn als Standardwert für Ihre Spalte address.new_id fest.

Informationen zum Festlegen des Werts Ihrer Sequenz finden Sie unter hier .

SELECT setval('address_new_id_seq', 10000);

Dies ist nur ein Beispiel. Verwenden Sie Ihren eigenen Sequenznamen (beliebig, Sie erstellen ihn) und eine Zahl, die größer ist als der maximale aktuelle Wert Ihrer Spalte.


Update: Wie in Lucas 'Antwort hervorgehoben (welche sollte die akzeptierte sein), sollten Sie auch angeben, zu welcher Spalte die Sequenz "gehört", indem Sie CREATE/ALTER SEQUENCE ... OWNED BY ... verwenden.

16
leonbloy

Schauen Sie in die Postgresql-Dokumentation von Datentyp serial . Serial ist nur eine kurze Hand.

CREATE TABLE tablename (
    colname SERIAL
);

entspricht der Angabe von:

CREATE SEQUENCE tablename_colname_seq;
CREATE TABLE tablename (
    colname integer NOT NULL DEFAULT nextval('tablename_colname_seq')
);
ALTER SEQUENCE tablename_colname_seq OWNED BY tablename.colname;
29
Lucas

Dies ist darauf zurückzuführen, dass Sie den serial -Datentyp nur verwenden können, wenn Sie eine neue Tabelle erstellen oder einer Tabelle eine neue Spalte hinzufügen. Wenn Sie versuchen, eine vorhandene Tabelle mit diesem Datentyp zu ändern, wird eine Fehlermeldung angezeigt. Weil serial kein echter Datentyp ist, sondern lediglich eine Abkürzung oder ein Alias ​​für eine etwas längere Abfrage.

Falls Sie den gleichen Effekt erzielen möchten, wie Sie erwarten, wenn Sie den seriellen Datentyp verwenden, wenn Sie eine vorhandene Tabelle ändern, können Sie Folgendes tun:

CREATE SEQUENCE my_serial AS integer START 1 OWNED BY address.new_id;

ALTER TABLE address ALTER COLUMN new_id SET DEFAULT nextval('my_serial');
  1. In der ersten Zeile der Abfrage wird eine eigene Sequenz mit dem Namen my_serial . OWEND BY erstellt, die eine neu erstellte Sequenz mit der genauen Spalte Ihrer Tabelle verbindet. In Ihrem Fall lautet die Tabelle address und die Spalte new_id. STARTAnweisung definiert, von welchem ​​Wert diese Sequenz ausgehen soll.

  2. Die zweite Zeile ändert Ihre Tabelle mit einem neuen Standardwert, der anhand der zuvor erstellten Sequenz bestimmt wird.

Es bringt Sie zum gleichen Ergebnis, von dem Sie erwartet hatten, dass Sie seriell verwenden.

0