Cum de a stabili auto increment cheie primară în PostgreSQL?

Am un tabel în PostgreSQL cu 22 de coloane, și vreau să adăugați o creștere automată a cheii primare.

Am încercat să creeze o coloană numită " id " de tip BIGSERIAL dar pgadmin a răspuns cu o eroare:

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

Stie cineva cum pot rezolva problema? Cum adaug un a crea un auto-incrementarea cheie primară în PostgreSQL fără recrearea masa din nou?

Soluția

Încercați această comandă:

ALTER TABLE your_table ADD COLUMN key_column BIGSERIAL PRIMARY KEY;

Încercați să-l cu aceeași DB-user ca cea pe care o ai creat masă.

Comentarii (11)

Auto-incrementarea cheie primară în postgresql:

Pasul 1, creare tabel:

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

Pasul 2, se introduce valori în tabel astfel, observa că mytable_key nu este specificată în prima listă de parametri, acest lucru provoacă default secvență a autoincrement.

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

*Pasul 3, selectați de la masa ta:**

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

Pasul 4, interpreta de ieșire:

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

Observăm că mytable_key coloana a fost auto incrementat.

ProTip:

Ar trebui să fie întotdeauna folosind o cheie primară pe masa dvs. pentru postgresql folosește intern tabel hash structuri pentru a crește viteza de insertii, șterge, actualizări și selectează. Dacă o cheie primară coloana (care este forțată unică și non-null) este disponibil, acesta poate fi depindea de a oferi un unic semințe pentru funcția de distribuire. Dacă nu există cheie primară coloana este disponibil, funcția de distribuire devine ineficient ca se selectează un alt set de coloane ca o cheie.

Comentarii (3)

A crea o auto-incrementarea cheie primară în postgresql, folosind o secvență personalizat:

Pasul 1, de a crea ordine:

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

Pasul 2, de a crea masă

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

Pasul 3, se introduce în 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!'
);

Etapa 4, observăm rânduri

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)

În două rânduri au cheile care încep de la 1 și se incrementează cu 1, astfel cum sunt definite printr-o succesiune.

Bonus Elite ProTip:

Programatori place să tastați, și tastarea în nextval('splog_adfarm_seq') este enervant. Puteți de tip "DEFAULT" pentru ca parametru în schimb, ca aceasta:

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

Pentru cele de mai sus pentru a lucra, trebuie să definiți o valoare implicită pentru care coloana cheie pe splog_adfarm masă. Care este mai frumoasa.

Comentarii (2)

Dacă doriți pentru a face acest lucru în pgadmin, este mult mai ușor. Se pare că în postgressql, pentru a adăuga o creștere automată a unei coloane, avem nevoie în primul rând de a crea o creștere automată a secvenței și adăugați-l la coloană obligatorie. Am făcut-o așa.

  1. în Primul rând aveți nevoie pentru a face sigur că există o cheie primară pentru tabel. Păstreze, de asemenea, tipul de date al cheii primare în bigint sau smallint. (Eu am folosit bigint, nu a putut găsi un tip de date numit în serie așa cum am menționat în alte răspunsuri în altă parte)

2)Apoi se adaugă o secvență de drept clic pe secvența-> adăuga noi secvență. Dacă nu există date în tabel, lasă-ordinea de drept este, nu't face orice modificări. Doar salvați-l. Dacă nu există date existente, se adauga ultima sau cea mai mare valoare în cheie primară coloana pentru valoarea Curentă în Definiții fila așa cum se arată mai jos.

3)în cele din Urmă, se adaugă linia `nextval('your_sequence_name'::regclass) la valoarea Implicită în cheia primară așa cum se arată mai jos.

Asigurați-vă că secvența de nume este corect aici. Asta este tot și auto increment ar trebui să funcționeze.

Comentarii (0)

Dacă doriți să utilizați numere într-o secvență, să definească o nouă secvență cu ceva de genul

CREATE SEQUENCE public.your_sequence
    INCREMENT 1
    START 1
    MINVALUE 1
;

și apoi modifica masa pentru a utiliza secvența pentru id-ul:

ALTER TABLE ONLY table ALTER COLUMN id SET DEFAULT nextval('your_sequence'::regclass);
Comentarii (2)

Poate am'm un pic de târziu pentru a răspunde la această întrebare, dar am'm de lucru pe acest subiect la treaba mea :)

Am vrut să scriu coloana 'a_code' = c1,c2,c3,c4...

În primul rând am deschis-o coloană cu numele ref_id și tipulde serie`. Apoi mi-am rezolvat problema mea cu aceasta comanda:

update myschema.mytable set a_code=cast('c'||"ref_id" as text) 
Comentarii (1)

Am încercat următorul script cu succes a auto-increment cheie primară în PostgreSQL.

CREATE SEQUENCE dummy_id_seq
    START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;

CREATE table dummyTable (
    id bigint DEFAULT nextval('dummy_id_seq'::regclass) NOT NULL,
    name character varying(50)
);
Comentarii (0)