Wie wird der Primärschlüssel in PostgreSQL automatisch inkrementiert?

Ich habe eine Tabelle in PostgreSQL mit 22 Spalten, und ich möchte einen automatisch inkrementierenden Primärschlüssel hinzufügen.

Ich habe versucht, eine Spalte namens id vom Typ BIGSERIAL zu erstellen, aber pgadmin hat mit einem Fehler geantwortet:

ERROR: sequence must have same owner as table it is linked to.

Weiß jemand, wie man dieses Problem beheben kann? Wie kann ich einen automatisch inkrementierenden Primärschlüssel in PostgreSQL hinzufügen, ohne die Tabelle neu zu erstellen?

Lösung

Versuchen Sie diesen Befehl:

ALTER TABLE your_table ADD COLUMN key_column BIGSERIAL PRIMARY KEY;

Versuchen Sie es mit demselben DB-Benutzer, mit dem Sie die Tabelle erstellt haben.

Kommentare (11)

Automatisch inkrementierender Primärschlüssel in Postgresql:

Schritt 1, erstellen Sie Ihre Tabelle:

CREATE TABLE epictable
(
    mytable_key    serial primary key,
    moobars        VARCHAR(40) not null,
    foobars        DATE
);

**Schritt 2, fügen Sie Werte in Ihre Tabelle wie folgt ein, beachten Sie, dass mytable_key in der ersten Parameterliste nicht angegeben ist, dies bewirkt, dass die Standardreihenfolge automatisch erhöht wird.

insert into epictable(moobars,foobars) values('delicious moobars','2012-05-01')
insert into epictable(moobars,foobars) values('worldwide interblag','2012-05-02')

*Schritt 3, select aus Ihrer Tabelle:**

el@voyager$ psql -U pgadmin -d kurz_prod -c "select * from epictable"

Schritt 4, interpretieren Sie die Ausgabe:

mytable_key  |        moobars        |  foobars   
-------------+-----------------------+------------
           1 | delicious moobars     | 2012-05-01
           2 | world wide interblags | 2012-05-02
(2 rows)

Beachten Sie, dass die Spalte mytable_key automatisch inkrementiert wurde.

ProTip:

Sie sollten immer einen Primärschlüssel für Ihre Tabelle verwenden, da Postgresql intern Hash-Tabellenstrukturen verwendet, um die Geschwindigkeit von Inserts, Deletes, Updates und Selects zu erhöhen. Wenn eine Primärschlüsselspalte (die erzwungenermaßen eindeutig und nicht null ist) verfügbar ist, kann man sich darauf verlassen, dass sie einen eindeutigen Seed für die Hash-Funktion liefert. Wenn keine Primärschlüsselspalte verfügbar ist, wird die Hash-Funktion ineffizient, da sie eine andere Gruppe von Spalten als Schlüssel auswählt.

Kommentare (3)

Erstellen eines automatisch inkrementierenden Primärschlüssels in Postgresql, unter Verwendung einer benutzerdefinierten Sequenz:

Schritt 1, Erstellen Sie Ihre Sequenz:

create sequence splog_adfarm_seq
    start 1
    increment 1
    NO MAXVALUE
    CACHE 1;
ALTER TABLE fact_stock_data_detail_seq
OWNER TO pgadmin;

Schritt 2, erstellen Sie Ihre Tabelle

CREATE TABLE splog_adfarm
(
    splog_key    INT unique not null,
    splog_value  VARCHAR(100) not null
);

Schritt 3, Einfügen in Ihre Tabelle

insert into splog_adfarm values (
    nextval('splog_adfarm_seq'), 
    'Is your family tree a directed acyclic graph?'
);

insert into splog_adfarm values (
    nextval('splog_adfarm_seq'), 
    'Will the smart cookies catch the crumb?  Find out now!'
);

Schritt 4, beobachten Sie die Zeilen

el@defiant ~ $ psql -U pgadmin -d kurz_prod -c "select * from splog_adfarm"

splog_key |                            splog_value                             
----------+--------------------------------------------------------------------
        1 | Is your family tree a directed acyclic graph?
        2 | Will the smart cookies catch the crumb?  Find out now!
(3 rows)

Die beiden Zeilen haben Schlüssel, die bei 1 beginnen und um 1 inkrementiert werden, wie durch die Sequenz definiert.

Bonus Elite ProTip:

Programmierer hassen das Tippen, und das Abtippen von nextval('splog_adfarm_seq') ist lästig. Sie können stattdessen DEFAULT für diesen Parameter eingeben, etwa so:

insert into splog_adfarm values (
    DEFAULT, 
    'Sufficient intelligence to outwit a thimble.'
);

Damit das oben genannte funktioniert, müssen Sie einen Standardwert für diese Schlüsselspalte in der Tabelle splog_adfarm definieren. Das ist hübscher.

Kommentare (2)