146 votes

Ajout de 'serial' à une colonne existante dans Postgres

J'ai une petite table (environ 30 lignes) dans ma base de données Postgres 9.0 avec un champ ID d'entier (la clé primaire) qui contient actuellement des entiers séquentiels uniques commençant à 1, mais qui n'a pas été créé à l'aide du mot clé 'serial'.

Comment puis-je modifier cette table de telle sorte que désormais, si elle est insérée dans cette table, ce champ se comportera comme s'il avait été créé avec le type "série"?

176voto

Euler Taveira Points 396

Regardez les commandes suivantes (spécialement le bloc commenté).

 DROP TABLE foo;
DROP TABLE bar;

CREATE TABLE foo (a int, b text);
CREATE TABLE bar (a serial, b text);

INSERT INTO foo (a, b) SELECT i, 'foo ' || i::text FROM generate_series(1, 5) i;
INSERT INTO bar (b) SELECT 'bar ' || i::text FROM generate_series(1, 5) i;

-- blocks of commands to turn foo into bar
CREATE SEQUENCE foo_a_seq;
ALTER TABLE foo ALTER COLUMN a SET DEFAULT nextval('foo_a_seq');
ALTER TABLE foo ALTER COLUMN a SET NOT NULL;
ALTER SEQUENCE foo_a_seq OWNED BY foo.a;    -- 8.2 or later

SELECT MAX(a) FROM foo;
SELECT setval('foo_a_seq', 5);  -- replace 5 by SELECT MAX result

INSERT INTO foo (b) VALUES('teste');
INSERT INTO bar (b) VALUES('teste');

SELECT * FROM foo;
SELECT * FROM bar;
 

72voto

John Barça Points 2740

Vous pouvez également utiliser START WITH pour démarrer une séquence à partir d'un point particulier, bien que setval accomplisse la même chose, comme dans la réponse d'Euler, par exemple:

 SELECT MAX(a) + 1 FROM foo;
CREATE SEQUENCE foo_a_seq START WITH 12345; -- replace 12345 with max above
ALTER TABLE foo ALTER COLUMN a SET DEFAULT nextval('foo_a_seq');
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X