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ť?
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.
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.