2012-02-28 11 views
56

Mam małą tabelę (~ 30 wierszy) w mojej bazie danych Postgres 9.0 z polem identyfikatora całkowitoliczbowego (klucz podstawowy), który obecnie zawiera unikalne sekwencyjne liczby całkowite zaczynające się od 1, ale który był nie utworzone przy użyciu słowa kluczowego "serial".Dodanie "numeru seryjnego" do istniejącej kolumny w Postgresie

Jak mogę zmienić tę tabelę tak, aby wstawki do tej tabeli powodowały, że to pole zachowywałoby się tak, jakby zostało utworzone z "seryjnym" jako typ?

Odpowiedz

86

Sprawdź następujące polecenia (szczególnie skomentowany blok).

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; 
+0

Skoro jesteś wspomnieć kluczy podstawowych w twojej OP, możesz również chcieć "ZMIENIAĆ TABELĘ foo DODAJ PIERWOTNY KLUCZ (a)". –

23

Można również użyć START WITH rozpocząć sekwencję z określonego punktu, chociaż SETVAL daje ten sam efekt, jak w odpowiedzi Eulera, np

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'); 
Powiązane problemy