V PostgreSQL imam tabelo z 22 stolpci in želim dodati primarni ključ s samodejnim povečanjem.
Poskušal sem ustvariti stolpec z imenom id
tipa BIGSERIAL, vendar se je pgadmin odzval z napako:
ERROR: sequence must have same owner as table it is linked to.
Ali kdo ve, kako odpraviti to težavo? Kako lahko v PostgreSQL dodam primarni ključ, ki se samodejno povečuje, ne da bi ponovno ustvaril tabelo?
Korak 1, ustvarjanje tabele:
CREATE TABLE epictable
(
mytable_key serial primary key,
moobars VARCHAR(40) not null,
foobars DATE
);
Korak 2, vstavite vrednosti v svojo tabelo na naslednji način, pri čemer opazite, da v prvem seznamu parametrov ni naveden ključ mytable_key, kar povzroči, da se privzeto zaporedje samodejno poveča.
insert into epictable(moobars,foobars) values('delicious moobars','2012-05-01')
insert into epictable(moobars,foobars) values('worldwide interblag','2012-05-02')
*Korak 3, izberite iz svoje tabele:**
el@voyager$ psql -U pgadmin -d kurz_prod -c "select * from epictable"
Korak 4, interpretirajte rezultat:
mytable_key | moobars | foobars
-------------+-----------------------+------------
1 | delicious moobars | 2012-05-01
2 | world wide interblags | 2012-05-02
(2 rows)
Opazite, da je bil stolpec mytable_key samodejno povečan.
ProTip:
V tabeli morate vedno uporabljati primarni ključ, saj postgresql interno uporablja strukture hash tabel za povečanje hitrosti vstavljanja, brisanja, posodabljanja in izbiranja. Če je na voljo stolpec primarnega ključa (ki je prisilno edinstven in ni ničeln), se lahko zanese na to, da bo zagotovil edinstveno seme za funkcijo hash. Če stolpec primarnega ključa ni na voljo, postane funkcija hash neučinkovita, saj kot ključ izbere kak drug niz stolpcev.
Za uporabo zaporedja po meri ustvarite primarni ključ s samodejnim povečevanjem v postgresql:
Korak 1, ustvarite svoje zaporedje:
create sequence splog_adfarm_seq
start 1
increment 1
NO MAXVALUE
CACHE 1;
ALTER TABLE fact_stock_data_detail_seq
OWNER TO pgadmin;
Korak 2, ustvarite svojo tabelo
CREATE TABLE splog_adfarm
(
splog_key INT unique not null,
splog_value VARCHAR(100) not null
);
Korak 3, vstavite v tabelo
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!'
);
Korak 4, opazujte vrstice
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)
Dve vrstici imata ključe, ki se začnejo pri 1 in se povečajo za 1, kot je določeno z zaporedjem.
Bonus Elite ProTip:
Programerji sovražijo tipkanje in tipkanje nextval('splog_adfarm_seq')
je nadležno. Namesto tega lahko za ta parameter vnesete DEFAULT
, kot na primer:
insert into splog_adfarm values (
DEFAULT,
'Sufficient intelligence to outwit a thimble.'
);
Da bo zgornji način deloval, morate določiti privzeto vrednost za ta ključni stolpec v tabeli splog_adfarm. Kaj je lepše.