Ik heb een tabel in PostgreSQL met 22 kolommen, en ik wil een auto increment primary key toevoegen.
Ik probeerde een kolom genaamd id
van het type BIGSERIAL te maken, maar pgadmin reageerde met een foutmelding:
ERROR: sequence must have same owner as table it is linked to.
Weet iemand hoe ik dit probleem kan oplossen? Hoe voeg ik een auto-incrementing primary key toe in PostgreSQL zonder de tabel opnieuw te maken?
Stap 1, maak uw tabel:
CREATE TABLE epictable
(
mytable_key serial primary key,
moobars VARCHAR(40) not null,
foobars DATE
);
Stap 2, voeg waarden in je tabel in zoals dit, merk op dat mytable_key niet is gespecificeerd in de eerste parameterlijst, dit zorgt ervoor dat de standaardreeks auto-increment.
insert into epictable(moobars,foobars) values('delicious moobars','2012-05-01')
insert into epictable(moobars,foobars) values('worldwide interblag','2012-05-02')
*Stap 3, selecteer uit uw tabel:**
el@voyager$ psql -U pgadmin -d kurz_prod -c "select * from epictable"
Stap 4, interpreteer de uitvoer:
mytable_key | moobars | foobars
-------------+-----------------------+------------
1 | delicious moobars | 2012-05-01
2 | world wide interblags | 2012-05-02
(2 rows)
Merk op dat de kolom mytable_key automatisch is opgehoogd.
ProTip:
U moet altijd een primaire sleutel in uw tabel gebruiken omdat postgresql intern hash tabel structuren gebruikt om de snelheid van inserts, deletes, updates en selects te verhogen. Als een primary key kolom (die gedwongen uniek en niet-null is) beschikbaar is, kan erop worden vertrouwd om een unieke zaad voor de hash-functie te verstrekken. Als er geen primaire sleutelkolom beschikbaar is, wordt de hashfunctie inefficiënt, omdat er dan een andere reeks kolommen als sleutel wordt geselecteerd.
Maak een auto incrementing primary key in postgresql, met behulp van een aangepaste sequence:
Stap 1, maak uw sequentie:
create sequence splog_adfarm_seq
start 1
increment 1
NO MAXVALUE
CACHE 1;
ALTER TABLE fact_stock_data_detail_seq
OWNER TO pgadmin;
Stap 2, maak je tabel
CREATE TABLE splog_adfarm
(
splog_key INT unique not null,
splog_value VARCHAR(100) not null
);
Stap 3, voeg in je tabel
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!'
);
Stap 4, observeer de rijen
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 twee rijen hebben sleutels die beginnen bij 1 en worden verhoogd met 1, zoals bepaald door de reeks.
Bonus Elite ProTip:
Programmeurs haten typen, en het uittypen van nextval('splog_adfarm_seq')
is vervelend. Je kunt in plaats daarvan DEFAULT
typen voor die parameter, zoals dit:
insert into splog_adfarm values (
DEFAULT,
'Sufficient intelligence to outwit a thimble.'
);
Om het bovenstaande te laten werken, moet je een standaard waarde definiëren voor die sleutelkolom in de splog_adfarm tabel. Wat mooier is.