Come impostare un incremento automatico di chiave primaria in PostgreSQL?

Ho una tabella nel database PostgreSQL con 22 colonne, e voglio aggiungere un incremento automatico di chiave primaria.

Ho provato a creare una colonna denominata id di 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 faccio ad aggiungere una creazione di un incremento automatico di chiave primaria in PostgreSQL senza ricreare la tabella di nuovo?

InformationsquelleAutor mkn | 2011-10-10



7 Replies
  1. 278

    Provare questo comando:

    ALTER TABLE your_table ADD COLUMN key_column BIGSERIAL PRIMARY KEY;

    Provare con lo stesso DB-utente della creato tabella.

    • (la chiave qui è quello di utilizzare un cavo SERIALE o BIGSERIAL tipo di dati, che crea una sequenza di dietro le quinte e incrementi/utilizzi a inserire il tempo)
    • e, se si desidera di riferimento da un’altra tabella, intero, o bigint
    • è possibile fare una chiave primaria(colonna esistente) in una tabella, senza aggiunta di una nuova colonna
    • sì, la sintassi è ALTER TABLE mytable ADD PRIMARY KEY (column); . Postgresql verificare che la colonna non contiene Null.
    • Questo errore in pgAdmin 4. Sia bigserial e serial stanno dando lo stesso errore: ERROR: syntax error at or near "BIGSERIAL"
    • Anche l’errore di sintassi utilizzando bigserial o seriale. C’è un minimo di postgresql versione per questo?
    • Dopo 6 anni ancora ad abituarsi 🙂
    • c’è un problema principale con questo, inserire x i conflitti non FARE NULLA incrementi seriale, anche se c’è un modo per ripristinare il max, io preferirei un incremento del tipo che non incrementare il seriale fino a quando l’inserto è stato di successo
    • La risposta canonica per il tuo problema: Un gapless contatore non può essere utilizzato nelle transazioni concorrenti. Vuoi forzare il DB per serializzare l’scrive la tabella che ostacolano le prestazioni in modo significativo. Pertanto, la maggior parte DBs (e Postgres) di default non gapless contatori.
    • interessante…quindi quando inserisci e se l’inserimento non riesce , non è necessario reimpostare la sequenza, è a conoscenza di qualche tecnica per farlo 🙂
    • È possibile cercare per postgresql gapless sequence. Per esempio sarà inciampare su dba.stackexchange.com/questions/119784/… e wiki.postgresql.org/wiki/…

  2. 247

    Incremento automatico di chiave primaria in postgresql:

    Passaggio 1 creare il tuo tavolo:

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

    Passo 2, inserire i valori nella tabella come questo, si noti che mytable_key non è specificato nel primo parametro della lista, in questo modo il default sequenza di autoincrement.

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

    Passo 3 select * from tabella:

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

    Passo 4, interpretare l’output:

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

    Osservare che mytable_key colonna di auto incrementato.

    ProTip:

    Si dovrebbe sempre essere utilizzando una chiave primaria sulla tabella, poiché postgresql utilizza internamente tabella hash strutture per aumentare la velocità di inserimenti, eliminazioni, gli aggiornamenti e seleziona. Se una colonna di chiave primaria (che è costretto univoco e non nullo) è disponibile, può essere dipeso per fornire un unico seme per la funzione di hash. Se non colonna di chiave primaria, è disponibile la funzione di hash diventa inefficiente come si seleziona un altro set di colonne di chiave.

    • Un minore nitpick, SERIAL creare un sequence dietro le quinte: postgresql.org/docs/9.2/static/…
    • è possibile fare una chiave primaria(colonna esistente) in una tabella, senza aggiunta di una nuova colonna
    • sarà una chiave esterna dichiarato con thing_id int references epictable(mytable_key) lavoro?
  3. 33

    Creazione di un incremento automatico di chiave primaria in postgresql, utilizzando una sequenza personalizzata:

    Passaggio 1 creare 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;

    Passo 2, crea la tabella

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

    Passo 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 sono le chiavi che inizia da 1 e sono incrementato di 1, come definito dalla sequenza.

    Bonus Elite ProTip:

    Programmatori odio scrivere e digitando il nextval('splog_adfarm_seq') è fastidioso. È possibile digitare DEFAULT per tale parametro, invece, come questo:

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

    Per il precedente lavoro, è necessario definire un valore di default per il tasto colonna splog_adfarm tabella. Che è più bella.

    • Quali sono i vantaggi di sequenze personalizzate? Probabilmente, la sicurezza?
    • Utilizzo di una sequenza personalizzata, potrebbe essere più facile per fare una replica master-master – che sarebbe utile se i dati di collegamento tra i due centri di calcolo è rotto, permettendo un record di essere creato su entrambi i server con Id diverso, che quindi rende più facile per sincronizzare il database di backup, mantenendo l’id generato in sedi separate.
  4. 16

    Se si vuole fare questo in pgadmin, è molto più facile. Mi sembra che in postgressql, per aggiungere un incremento automatico di una colonna, in primo luogo abbiamo bisogno di creare un incremento automatico di sequenza e aggiungere la colonna richiesta. Ho fatto come questo.

    1) in Primo luogo è necessario assicurarsi che non vi è una chiave primaria per la tabella. Anche mantenere il tipo di dati della chiave primaria di tipo bigint o smallint. (Io ho usato bigint, non poteva trovare un tipo chiamato serial come già detto in altre risposte altrove)

    2)Quindi aggiungere una sequenza facendo clic destro su di sequenza-> aggiungere nuova sequenza.
    Se non ci sono dati nella tabella, lasciare la sequenza di come è, di non fare nessuna modifica. Basta salvarlo.
    Se c’è i dati esistenti, aggiungere il valore più alto nella colonna di chiave primaria il valore di Corrente Definizioni scheda come mostrato di seguito.
    Come impostare un incremento automatico di chiave primaria in PostgreSQL?

    3)Infine, aggiungere la riga nextval('your_sequence_name'::regclass) al valore Predefinito chiave primaria, come illustrato di seguito.

    Come impostare un incremento automatico di chiave primaria in PostgreSQL?
    Assicurarsi che la sequenza sia corretta qui. Questo è tutto e di incremento automatico dovrebbe funzionare.

  5. 4

    Se si desidera utilizzare i numeri in sequenza, la definizione di una nuova sequenza con qualcosa di simile

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

    e quindi modificare la tabella di 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?
    • È possibile condividere la stessa sequenza di tabelle diverse, ma la sequenza di aumento per ogni record di ogni tabella.
  6. 0

    Forse sono un po ‘ tardi per rispondere a questa domanda, ma sto lavorando su questo argomento al mio lavoro 🙂

    Ho voluto scrivere la colonna ‘a_code’ = c1,c2,c3,c4…

    In primo luogo ho aperto una colonna con il nome ref_id e il tipo di serial.
    Poi ho risolto il mio problema con questo comando:

    update myschema.mytable set a_code=cast('c'||"ref_id" as text) 
    • è possibile fare una chiave primaria(colonna esistente) in una tabella, senza aggiunta di una nuova colonna
  7. 0

    Ho provato lo script riportato di seguito, con successo, di incremento automatico della 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)
    );

Lascia un commento