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?
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.
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.