postgresql - tipos - Cambiar clave principal a incremento automático
tipos de clave principal en access (3)
Tengo un jugador de mesa y un ID de jugador de clave principal que es el carácter (7). Ya tengo algunos registros en esta tabla, y también tengo otras tablas que tienen ID de jugador como clave externa, y esas tablas también tienen algunos registros.
¿Cómo puedo configurar el ID de jugador para auto-incremento? Después de leer un rato, creo que debería haberlo hecho desde el principio, pero como no puedo hacerlo ahora, ¿puedo hacerlo de todos modos?
Por ejemplo, cuando ejecuto este
ALTER TABLE player ADD COLUMN key_column BIGSERIAL PRIMARY KEY;
devuelve un error:
ERROR: multiple primary keys for table "player" are not allowed
y si descarto el ID de jugador existente, los registros en otras tablas que hacen referencia a él también se eliminarán.
¿Hay alguna forma de "cambiar" la ID de jugador de la clave principal existente para el incremento automático?
Lo resuelvo: solo agrega un valor predeterminado de incremento automático al ID de jugador:
create sequence player_id_seq;
alter table player alter playerid set default nextval(''player_id_seq'');
Select setval(''player_id_seq'', 2000051 ); --set to the highest current value of playerID
No creo que pueda tener 2 claves principales en una tabla, y como el tipo de datos de ID de jugador es el carácter (7), no creo que pueda cambiarlo a incremento automático.
Por lo tanto, creo que tendría que eliminar la restricción de la clave principal en playerID si desea poder agregar una nueva clave principal.
Como ya tiene datos en su mesa y usa playerID como clave externa en otras tablas, le aconsejaría que duplique su tabla de jugador y pruebe estos cambios en su segunda tabla para evitar corromper sus datos.
Pero antes de intentar todo esto, asegúrese de que está intentando realizar estos cambios utilizando el mismo db-user que creó las tablas que está cambiando.
DROP SCHEMA tmp CASCADE;
CREATE SCHEMA tmp ;
SET search_path=tmp;
-- create som data to play with
CREATE TABLE bagger
( player_id CHAR(6)
, tralala varchar
);
-- populate the table
INSERT INTO bagger(player_id,tralala)
SELECT gs::text, ''zzz_'' || gs::text
FROM generate_series(1,10) gs
;
SELECT * FROM bagger;
--
-- create the sequence, change the datatype and bind it to the sequence
--
CREATE SEQUENCE player_id_seq;
ALTER TABLE bagger
ALTER COLUMN player_id TYPE INTEGER USING player_id::integer
, ALTER COLUMN player_id SET NOT NULL
, ALTER COLUMN player_id SET DEFAULT nextval(''player_id_seq'')
;
ALTER SEQUENCE player_id_seq
OWNED BY bagger.player_id
;
--
-- reset the sequence to containe the maximum occuring player_id in the table
--
SELECT setval(''player_id_seq'', mx.mx)
FROM (SELECT MAX(player_id) AS mx FROM bagger) mx
;
SELECT * FROM bagger;
/d bagger
Salida:
DROP SCHEMA
CREATE SCHEMA
SET
CREATE TABLE
INSERT 0 10
player_id | tralala
-----------+---------
1 | zzz_1
2 | zzz_2
3 | zzz_3
4 | zzz_4
5 | zzz_5
6 | zzz_6
7 | zzz_7
8 | zzz_8
9 | zzz_9
10 | zzz_10
(10 rows)
CREATE SEQUENCE
ALTER TABLE
setval
--------
10
(1 row)
player_id | tralala
-----------+---------
1 | zzz_1
2 | zzz_2
3 | zzz_3
4 | zzz_4
5 | zzz_5
6 | zzz_6
7 | zzz_7
8 | zzz_8
9 | zzz_9
10 | zzz_10
(10 rows)
Table "tmp.bagger"
Column | Type | Modifiers
-----------+-------------------+-----------------------------------------------------
player_id | integer | not null default nextval(''player_id_seq''::regclass)
tralala | character varying |