¿Cómo establecer el incremento automático de la clave primaria en PostgreSQL?

Tengo una tabla en PostgreSQL con 22 columnas, y quiero añadir una clave primaria auto incrementable.

Traté de crear una columna llamada id de tipo BIGSERIAL pero pgadmin respondió con un error:

idioma: lang-none -->

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

¿Alguien sabe cómo solucionar este problema? ¿Cómo puedo añadir una clave primaria autoincrementable en PostgreSQL sin volver a crear la tabla?

Solución

Prueba este comando:

ALTER TABLE your_table ADD COLUMN key_column BIGSERIAL PRIMARY KEY;

Pruébalo con el mismo usuario de la BD con el que has creado la tabla.

Comentarios (11)

Incremento automático de la clave primaria en postgresql:

Paso 1, crear la tabla:

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

Paso 2, inserte los valores en su tabla así, observe que no se especifica mytable_key en la primera lista de parámetros, esto hace que la secuencia por defecto se autoincremente.

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

*Paso 3, seleccione de su tabla:**

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

Paso 4, interpretar la salida:

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

Observa que la columna mytable_key se ha autoincrementado.

Consejo de experto:

Usted siempre debe utilizar una clave primaria en su tabla porque postgresql internamente utiliza estructuras de tabla hash para aumentar la velocidad de inserciones, eliminaciones, actualizaciones y selecciones. Si se dispone de una columna de clave primaria (que es única y no nula), se puede confiar en ella para proporcionar una semilla única para la función hash. Si no se dispone de una columna de clave primaria, la función hash se vuelve ineficiente, ya que selecciona algún otro conjunto de columnas como clave.

Comentarios (3)

Crear una clave primaria autoincrementada en postgresql, utilizando una secuencia personalizada:

Paso 1, crear su secuencia:

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

Paso 2, crea tu tabla

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

Paso 3, inserte en su tabla

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

Paso 4, observar las filas

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)

Las dos filas tienen claves que comienzan en 1 y se incrementan en 1, según lo definido por la secuencia.

Bonus Elite ProTip:

Los programadores odian escribir, y escribir el nextval('splog_adfarm_seq') es molesto. Puedes escribir DEFAULT para ese parámetro en su lugar, así:

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

Para que lo anterior funcione, tienes que definir un valor por defecto para esa columna clave en la tabla splog_adfarm. Lo cual es más bonito.

Comentarios (2)