Come impostare la chiave primaria di incremento automatico in PostgreSQL?


259

Ho una tabella in PostgreSQL con 22 colonne e voglio aggiungere una chiave primaria di incremento automatico.

Ho provato a creare una colonna chiamata iddi tipo BIGSERIAL ma pgadmin ha risposto con un errore:

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

Qualcuno sa come risolvere questo problema? Come posso aggiungere una creazione di una chiave primaria auto-incrementante in PostgreSQL senza ricreare nuovamente la tabella?

Risposte:


292

Prova questo comando:

ALTER TABLE your_table ADD COLUMN key_column BIGSERIAL PRIMARY KEY;

Provalo con lo stesso utente DB di quello che hai creato la tabella.


75
(la chiave qui è usare un tipo di dati SERIAL o BIGSERIAL, che crea una sequenza dietro le quinte e la incrementa / la usa al momento dell'inserimento)
rogerdpack

16
e se vuoi fare riferimento ad esso da un'altra tabella, usa numeri interi o bigint
Ward,

2
@satishkilari: sì, la sintassi è ALTER TABLE mytable ADD PRIMARY KEY (column);. Postgresql verificherà che la colonna non contenga NULL.
AH,

3
Ottenere questo errore in pgAdmin 4. Entrambi bigseriale serialstanno dando lo stesso errore:ERROR: syntax error at or near "BIGSERIAL"
adi

5
Ottenere anche l'errore di sintassi usando bigserial o seriale. Esiste un minimo postgresql per questo?
dacDave,

251

Chiave primaria a incremento automatico in postgresql:

Passaggio 1, crea la tua tabella:

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

Passaggio 2, inserire i valori nella tabella in questo modo, notare che mytable_key non è specificato nel primo elenco di parametri, in questo modo la sequenza predefinita si autoincrementa.

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

Passaggio 3, selezionare * dalla tabella:

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

Passaggio 4, interpretare l'output:

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

Si noti che la colonna mytable_key è stata incrementata automaticamente.

PROTIP:

Dovresti sempre usare una chiave primaria sulla tua tabella perché postgresql utilizza internamente le strutture della tabella hash per aumentare la velocità di inserimenti, eliminazioni, aggiornamenti e selezioni. Se è disponibile una colonna chiave primaria (che è forzata univoca e non nulla), può dipendere da fornire un seme univoco per la funzione hash. Se non è disponibile alcuna colonna chiave primaria, la funzione hash diventa inefficiente in quanto seleziona un altro set di colonne come chiave.


21
Un piccolo pignolo, SERIALcrea un sequencedietro le quinte: postgresql.org/docs/9.2/static/…
carbocation

1
è possibile creare una chiave primaria (colonna esistente) in una tabella senza aggiungere nuove colonne
kilari satish

sarà una chiave esterna dichiarata con thing_id int references epictable(mytable_key)lavoro?

36

Crea una chiave primaria a incremento automatico in postgresql, usando una sequenza personalizzata:

Passaggio 1, crea la sequenza:

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

Passaggio 2, crea il tuo tavolo

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

Passaggio 3, inserire nella tabella

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

Passaggio 4, osservare le righe

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)

Le due righe hanno chiavi che iniziano da 1 e sono incrementate di 1, come definito dalla sequenza.

Bonus Elite ProTip:

I programmatori odiano scrivere e scrivere il nextval('splog_adfarm_seq')è fastidioso. Puoi invece digitare DEFAULTper quel parametro, in questo modo:

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

Affinché quanto sopra funzioni, è necessario definire un valore predefinito per quella colonna chiave nella tabella splog_adfarm. Che è più bello.


2
Quali sono i vantaggi delle sequenze personalizzate? Probabilmente, sicurezza?
Léo Léopold Hertz

1
@Masi Un uso di una sequenza personalizzata potrebbe essere quello di semplificare l'esecuzione della replica master-master - che sarebbe utile se il collegamento dati tra due data center è interrotto - consentendo la creazione di record su entrambi i server con ID diversi, che quindi semplifica la sincronizzazione del backup dei database mantenendo gli ID generati in posizioni separate.
Vincent McNabb,

16

Se vuoi farlo in pgadmin, è molto più semplice. Sembra in postgressql, per aggiungere un incremento automatico a una colonna, dobbiamo prima creare una sequenza di incremento automatico e aggiungerla alla colonna richiesta. Mi è piaciuto

1) Innanzitutto devi assicurarti che ci sia una chiave primaria per la tua tabella. Mantenere anche il tipo di dati della chiave primaria in bigint o smallint. (Ho usato bigint, non sono riuscito a trovare un tipo di dati chiamato seriale come menzionato in altre risposte altrove)

2) Quindi aggiungere una sequenza facendo clic con il tasto destro su sequenza-> aggiungi nuova sequenza . Se non ci sono dati nella tabella, lasciare la sequenza così com'è, non apportare alcuna modifica. Basta salvarlo. Se sono presenti dati esistenti, aggiungere l'ultimo o il valore più alto nella colonna chiave primaria al valore corrente nella scheda Definizioni come mostrato di seguito. inserisci qui la descrizione dell'immagine

3) Infine, aggiungi la riga nextval('your_sequence_name'::regclass)al valore predefinito nella chiave primaria come mostrato di seguito.

inserisci qui la descrizione dell'immagine Assicurati che il nome della sequenza sia corretto qui. Questo è tutto e l'incremento automatico dovrebbe funzionare.


9

Se vuoi usare numeri in una sequenza, definisci una nuova sequenza con qualcosa di simile

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

e quindi modificare la tabella per utilizzare la sequenza per l'id:

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

Devo creare una nuova sequenza per ogni tabella?
Bharat Chhabra,

È possibile condividere la stessa sequenza per tabelle diverse, ma la sequenza aumenterà per ciascun record in ciascuna tabella.
acaruci,

1

Ho provato il seguente script per auto-incrementare con successo la chiave primaria in 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)
);

MODIFICARE:

CREATE table dummyTable (
    id SERIAL NOT NULL,
    name character varying(50)
)

La parola chiave SERIAL crea automaticamente una sequenza per la rispettiva colonna.


Puoi reimpostare un SERIAL come fai per una SEQUENZA?
giovedì

1
Sì !, ho verificato ALTER SEQUENCE dummytable_id_seq RESTART WITH 1;e funziona.
Asad Shakeel,

0

Forse sono un po 'in ritardo per rispondere a questa domanda, ma sto lavorando su questo argomento nel mio lavoro :)

Volevo scrivere la colonna 'a_code' = c1, c2, c3, c4 ...

Innanzitutto ho aperto una colonna con il nome ref_ide il tipo serial. Quindi ho risolto il mio problema con questo comando:

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

è possibile creare una chiave primaria (colonna esistente) in una tabella senza aggiungere nuove colonne
kilari satish
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.