Hvordan angi automatisk økning av primærnøkkel i PostgreSQL?

Jeg har en tabell i PostgreSQL med 22 kolonner, og jeg vil legge til en automatisk inkrement primærnøkkel.

Jeg prøvde å opprette en kolonne kalt id av typen BIGSERIAL, men pgadmin svarte med en feil:

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

Vet noen hvordan du løser dette problemet? Hvordan legger jeg til en automatisk inkrementerende primærnøkkel i PostgreSQL uten å gjenskape tabellen igjen?

Løsning

Prøv denne kommandoen:

ALTER TABLE your_table ADD COLUMN key_column BIGSERIAL PRIMARY KEY;

Prøv det med samme DB-bruker som den du har opprettet tabellen med.

Kommentarer (11)

Automatisk inkrementering av primærnøkkel i postgresql:

Trinn 1, opprett tabellen: .

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

**Trinn 2, sett inn verdier i tabellen slik, legg merke til at mytable_key ikke er spesifisert i den første parameterlisten, dette fører til at standardsekvensen økes automatisk.

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

*Trinn 3, velg fra tabellen din: .

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

Trinn 4, tolk utdataene:

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

Legg merke til at kolonnen mytable_key har blitt automatisk inkrementert.

ProTip:

Du bør alltid bruke en primærnøkkel på tabellen din fordi postgresql internt bruker hashtabellstrukturer for å øke hastigheten på innsetting, sletting, oppdatering og valg. Hvis en primærnøkkelkolonne (som er tvunget unik og ikke-null) er tilgjengelig, kan den være avhengig av å gi et unikt frø for hash-funksjonen. Hvis ingen primærnøkkelkolonne er tilgjengelig, blir hash-funksjonen ineffektiv ettersom den velger et annet sett med kolonner som nøkkel.

Kommentarer (3)

Opprett en automatisk inkrementerende primærnøkkel i postgresql, ved hjelp av en egendefinert sekvens:

Trinn 1, opprett sekvensen din: **.

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

Trinn 2, opprett din tabell

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

Trinn 3, sett inn i tabellen din {{10451604}}

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!'
);

Trinn 4, følg radene Trinn 4, følg radene

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)

De to radene har nøkler som starter på 1 og inkrementeres med 1, som definert av sekvensen.

Bonus Elite ProTip:

Programmerere hater å skrive, og å skrive ut nextval('splog_adfarm_seq') er irriterende. Du kan skrive DEFAULT for den parameteren i stedet, slik som dette:

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

For at ovennevnte skal fungere, må du definere en standardverdi for den nøkkelkolonnen i splog_adfarm-tabellen. Som er penere.

Kommentarer (2)