Ako nastaviť automatickú inkrementáciu primárneho kľúča v PostgreSQL?

Mám tabuľku v PostgreSQL s 22 stĺpcami a chcem pridať primárny kľúč s automatickou inkrementáciou.

Pokúsil som sa vytvoriť stĺpec s názvom id typu BIGSERIAL, ale pgadmin odpovedal chybou:

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

Vie niekto, ako tento problém vyriešiť? Ako môžem pridať vytvorenie automaticky sa zvyšujúceho primárneho kľúča v PostgreSQL bez toho, aby som musel tabuľku znovu vytvárať?

Riešenie

Vyskúšajte tento príkaz:

ALTER TABLE your_table ADD COLUMN key_column BIGSERIAL PRIMARY KEY;

Vyskúšajte ho s tým istým používateľom DB, s ktorým ste vytvorili tabuľku.

Komentáre (11)

Automatická inkrementácia primárneho kľúča v postgresql:

Krok 1, vytvorenie tabuľky:

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

Krok 2, vložte hodnoty do vašej tabuľky takto, všimnite si, že v prvom zozname parametrov nie je zadaný mytable_key, to spôsobí automatické zvýšenie predvolenej sekvencie.

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

*Krok 3, vyberte z vašej tabuľky:**

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

Krok 4, interpretujte výstup:

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

Všimnite si, že stĺpec mytable_key bol automaticky inkrementovaný.

ProTip:

V tabuľke by ste mali vždy používať primárny kľúč, pretože postgresql interne používa štruktúry hash tabuliek na zvýšenie rýchlosti vkladania, mazania, aktualizácie a výberu. Ak je k dispozícii stĺpec primárneho kľúča (ktorý je vynútený ako jedinečný a nenulový), možno sa naň spoľahnúť, že poskytne jedinečný seed pre hashovaciu funkciu. Ak nie je k dispozícii žiadny stĺpec primárneho kľúča, hašovacia funkcia sa stáva neefektívnou, pretože ako kľúč vyberá nejakú inú množinu stĺpcov.

Komentáre (3)

Vytvorenie automaticky inkrementujúceho primárneho kľúča v postgresql pomocou vlastnej sekvencie:

Krok 1, vytvorenie sekvencie:

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

Krok 2, vytvorte svoju tabuľku

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

Krok 3, vložte do tabuľky

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

Krok 4, pozorujte riadky

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)

Tieto dva riadky majú kľúče, ktoré začínajú na 1 a sú inkrementované o 1, ako je definované v sekvencii.

Bonusový tip Elite ProTip:

Programátori neznášajú písanie a vypisovanie nextval('splog_adfarm_seq') je otravné. Namiesto toho môžete pre tento parameter napísať DEFAULT, napríklad takto:

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

Aby vyššie uvedené fungovalo, musíte definovať predvolenú hodnotu pre tento kľúčový stĺpec v tabuľke splog_adfarm. Čo je krajšie.

Komentáre (2)