Modification de la clé primaire de type int à la série
Est-il un moyen de modifier la clé primaire de type int à la série sans la suppression de la table? J'ai déjà beaucoup de données dans la table et je ne veux pas le supprimer.
Et comme toujours, il faut prendre l'habitude de l'exécution d'une sauvegarde complète avant l'exécution de modifier des requêtes SQL personnes au hasard sur Internet 😉
-- temp schema for testing-- ----------------------------DROPSCHEMA tmp CASCADE;CREATESCHEMA tmp ;SET search_path=tmp;CREATETABLE bagger
( id INTEGER NOTNULLPRIMARYKEY, tralala varchar
);INSERTINTO bagger(id,tralala)SELECT gs,'zzz_'|| gs::text
FROM generate_series(1,100) gs
;DELETEFROM bagger WHERE random()<0.9;-- SELECT * FROM bagger;-- CREATE A sequence and tie it to bagger.id-- -------------------------------------------CREATE SEQUENCE bagger_id_seq;ALTERTABLE bagger
ALTERCOLUMN id SETNOTNULL,ALTERCOLUMN id SETDEFAULT nextval('player_id_seq');ALTER SEQUENCE bagger_id_seq
OWNED BY bagger.id
;SELECT setval('bagger_id_seq', MAX(ba.id))FROM bagger ba
;-- Check the result-- ------------------SELECT*FROM bagger;\d bagger
\d bagger_id_seq
Convertir un int en une série plus ou moins seul moyen de l'ajout d'une séquence par défaut à la valeur, afin d'en faire une série;
Choisir une valeur de départ pour la série, supérieure à la valeur existante dans la table
SELECT MAX(id)+1 FROM mytable
Créer une séquence de la série (tablename_columnname_seq est un bon nom)
CREATE SEQUENCE test_id_seq MINVALUE 3
(en supposant que vous voulez commencer à 3)Modifier la valeur par défaut de la colonne à utiliser la séquence
ALTER TABLE test ALTER id SET DEFAULT nextval('test_id_seq')
Modifier l'ordre d'être propriétaire de la table/colonne;
ALTER SEQUENCE test_id_seq OWNED BY test.id
Un très simple SQLfiddle démo.
Et comme toujours, il faut prendre l'habitude de l'exécution d'une sauvegarde complète avant l'exécution de modifier des requêtes SQL personnes au hasard sur Internet 😉
OriginalL'auteur Joachim Isaksson
OriginalL'auteur wildplasser