2013-05-10 12 views
18

W pgsql, istnieje sposób na tabelę z kilkoma wartościami i wybierz jedną z nich (na przykład, id_kolekcji), dowiedz się, jaka jest jej najwyższa wartość i wprowadź każdy nowy wpis jest umieszczany w przyrostach tabeli od tej wartości.Zmień typ danych kolumny na szeregowy

Przypuszczam, to było po prostu zbyt łatwo mieli szansę pracy ..

ALTER TABLE address ALTER COLUMN new_id TYPE SERIAL 

____________________________________ 
ERROR: type "serial" does not exist 

Dzięki bardzo za każdym wglądu!

+1

Może Pan wyjaśnić nieco więcej o tym, dlaczego trzeba dodać nowy identyfikator seryjny do tabeli, która prawdopodobnie ma już klucz podstawowy? Czy chcesz zastąpić istniejący klucz podstawowy identyfikatorem seryjnym? Jakie jest tego tło? –

+0

@CraigRinger W moim ostatnim pytaniu miałem problem z zaimportowaniem bazy danych. Zdecydowałem, że skoro mój system wymaga znacznych ulepszeń, poradzę sobie z tym w godzinach pracy jutro. Jest tylko kilka tabel, do których muszę mieć dostęp. Więc przyniosłem tabelę, ale sekwencja, która kontrolowała kolumnę inkrementującą w tej tabeli, była przyczyną problemu w transferze. Nie miałem szczęścia, zmieniając kolumnę na klucz podstawowy, więc pomyślałem, że mogę zrobić "seryjny" zaczynając od aktualnej najwyższej wartości tabeli. Czy łatwiej byłoby zrobić nowy col i uczynić go PrimKey? – 1252748

+0

Najlepiej połączyć z wcześniejszymi pytaniami, które są wymagane w odpowiednim kontekście. Jak to "przenieśliście"? "nie miał szczęścia" w jakim sensie? Dokładne polecenia, dokładne komunikaty o błędach itp. –

Odpowiedz

12

Szybki rzut oka na docs mówi, że

The data types smallserial, serial and bigserial are not true types but merely a notational convenience for creating unique identifier columns

Jeśli chcesz, aby istniejący (całkowitej) Kolumna do pracy jako „serial”, wystarczy utworzyć sekwencję ręcznie (nazwa jest dowolna), ustaw jego bieżącą wartość na maksymalną (lub większą) bieżącą wartość address.new_id, ustawiając ją jako wartość domyślną dla kolumny address.new_id.

Aby ustawić wartość sekwencji, patrz here.

SELECT setval('address_new_id_seq', 10000);

Jest to tylko przykład, użyć własnego nazwę sekwencji (arbitralne go utworzyć) i numer większą niż maksymalna wartość prądu swojej kolumnie.


Aktualizacja: jak wskazał odpowiedź Lucasa (które powinny być acccepted jeden) należy również określić, do którego kolumna sekwencja «należy do» za pomocą CREATE/ALTER SEQUENCE ... OWNED BY ...

+0

w porządku. Co to znaczy "ustawić aktualną wartość sekwencji"? Patrzę teraz na sekwencje, ale są dla mnie nowością. Czy chcesz powiedzieć, że poprzez sekwencję mogę stworzyć własną "wygodę notacji dla kolumn z unikalnymi identyfikatorami"? – 1252748

+0

Kolumna typu szeregowego (pseudo) jest po prostu kolumną całkowitą, która ma domyślną wartość, wartość jakiejś sekwencji (i inkrementuje ją). Dodałem instrukcję, aby ustawić wartość. – leonbloy

25

zajrzeć do dokumentacji postgresql z datatype serial. Serial jest tylko krótką ręką.

CREATE TABLE tablename (
    colname SERIAL 
); 

jest równoznaczne z określeniem:

CREATE SEQUENCE tablename_colname_seq; 
CREATE TABLE tablename (
    colname integer NOT NULL DEFAULT nextval('tablename_colname_seq') 
); 
ALTER SEQUENCE tablename_colname_seq OWNED BY tablename.colname; 
+0

Powinienem wspomnieć, że jest to szybka poprawka, dopóki nie będę mógł uaktualnić mojej starszej wersji postgre (jak się dowiedziałem). Kiedy próbuję zrobić "OWNED BY" dostaję błąd składni .. – 1252748

+0

@thomas, więc jaka jest twoja wersja postgres? – Lucas

Powiązane problemy