it-swarm.com.de

Wie kann man den Primärschlüssel für die automatische Erhöhung in PostgreSQL einstellen?

Ich habe eine Tabelle in PostgreSQL mit 22 Spalten, und ich möchte einen Primärschlüssel für die automatische Erhöhung 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.

Kann jemand dieses Problem beheben? Wie füge ich einen automatisch inkrementierenden Primärschlüssel in PostgreSQL hinzu, ohne die Tabelle erneut zu erstellen?

241
mkn

Versuchen Sie diesen Befehl:

ALTER TABLE your_table ADD COLUMN key_column BIGSERIAL PRIMARY KEY;

Versuchen Sie es mit demselben DB-Benutzer wie dem, den Sie erstellt haben der Tabelle.

267
A.H.

Primärschlüssel in postgresql automatisch inkrementieren:

Schritt 1, erstellen Sie Ihre Tabelle:

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

Schritt 2: Werte wie folgt in die Tabelle einfügen. Beachten Sie, dass mytable_key nicht in der ersten Parameterliste angegeben ist. Dadurch wird die Standardsequenz automatisch inkrementiert.

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

Schritt 3, wähle * aus deiner Tabelle:

[email protected]$ psql -U pgadmin -d kurz_prod -c "select * from epictable"

Schritt 4, interpretiere 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 beim Einfügen, Löschen, Aktualisieren und Auswählen zu erhöhen. Wenn eine Primärschlüsselspalte (die eindeutig und nicht null erzwungen wird) verfügbar ist, kann davon ausgegangen werden, dass ein eindeutiger Startwert für die Hash-Funktion bereitgestellt wird. Wenn keine Primärschlüsselspalte verfügbar ist, wird die Hash-Funktion ineffizient, wenn andere Spaltengruppen als Schlüssel ausgewählt werden.

242
Eric Leschinski

Erstellen Sie einen automatisch inkrementierenden Primärschlüssel 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, erstelle deine Tabelle

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

Schritt 3, in den Tisch einfügen

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, beobachte die Reihen

[email protected] ~ $ 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 erhöht werden, wie in der Sequenz definiert.

Bonus Elite ProTip:

Programmierer hassen das Tippen und das Eingeben der nextval('splog_adfarm_seq') ist ärgerlich. Sie können stattdessen DEFAULT für diesen Parameter wie folgt eingeben:

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

Damit obiges funktioniert, müssen Sie einen Standardwert für diese Schlüsselspalte in der Tabelle splog_adfarm definieren. Welches ist hübscher.

33
Eric Leschinski

Wenn Sie dies in pgadmin machen möchten, ist es viel einfacher. In postgressql scheint es, um einer Spalte ein Auto-Inkrement hinzuzufügen. Zuerst müssen Sie eine Auto-Inkrement-Sequenz erstellen und sie der erforderlichen Spalte hinzufügen. Das hat mir gefallen.

1) Zuerst müssen Sie sicherstellen, dass es einen Primärschlüssel für Ihre Tabelle gibt. Behalten Sie auch den Datentyp des Primärschlüssels in bigint oder smallint bei. (Ich habe bigint verwendet und konnte keinen Datentyp finden, der als seriell bezeichnet wird, wie in anderen Antworten an anderer Stelle erwähnt.)

2) Fügen Sie dann eine Sequenz hinzu, indem Sie mit der rechten Maustaste auf Sequenz-> Neue Sequenz ..__ klicken. Wenn sich in der Tabelle keine Daten befinden, lassen Sie die Reihenfolge unverändert, und nehmen Sie keine Änderungen vor. Speichern Sie es einfach . Falls Daten vorhanden sind, fügen Sie den letzten oder höchsten Wert in der Primärschlüsselspalte zum aktuellen Wert im Register Definitionen hinzu, wie unten gezeigt .  enter image description here

3) Fügen Sie dem Standardwert in Ihrem Primärschlüssel schließlich die Zeile nextval('your_sequence_name'::regclass) hinzu (siehe unten). 

 enter image description here Stellen Sie sicher, dass der Sequenzname hier korrekt ist. Dies ist alles und das automatische Inkrement sollte funktionieren.

16
toing_toing

Wenn Sie Zahlen in einer Sequenz verwenden möchten, definieren Sie eine neue Sequenz mit etwas

CREATE SEQUENCE public.your_sequence
    INCREMENT 1
    START 1
    MINVALUE 1
;

und ändern Sie dann die Tabelle, um die Sequenz für die ID zu verwenden:

ALTER TABLE ONLY table ALTER COLUMN id SET DEFAULT nextval('your_sequence'::regclass);
2
acaruci

Ich habe das folgende Skript ausprobiert, um den Primärschlüssel in PostgreSQL erfolgreich inkrementieren zu können.

CREATE SEQUENCE dummy_id_seq
    START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;

CREATE table dummyTable (
    id bigint DEFAULT nextval('dummy_id_seq'::regclass) NOT NULL,
    name character varying(50)
);
0
Asad Shakeel

Vielleicht bin ich etwas spät dran, um diese Frage zu beantworten, aber ich arbeite an diesem Thema in meinem Job :) 

Ich wollte die Spalte 'a_code' = c1, c2, c3, c4 schreiben ...

Zuerst öffnete ich eine Spalte mit dem Namen ref_id und dem Typ serial. Dann löste ich mein Problem mit diesem Befehl: 

update myschema.mytable set a_code=cast('c'||"ref_id" as text) 
0
user5838061