2012-02-26 13 views
24

Jak utworzyć sekwencję w tabeli, tak aby pasowała od 0 -> Maksymalna wartość? Próbowałem za pomocą następującego kodu SQL, ale nie wkładać żadnych wartości w tabeli, że używam:Tworzenie sekwencji na istniejącej tabeli

CREATE SEQUENCE rid_seq; 
ALTER TABLE test ADD COLUMN rid INTEGER; 
ALTER TABLE test ALTER COLUMN rid SET DEFAULT nextval('rid_seq'); 

tabela Próbuję wstawić kolejność jest wyjście z innego zapytania. Nie mogę ustalić, czy sensowne jest dodanie sekwencji podczas tego wstępnego zapytania, czy dodanie sekwencji do tabeli po wykonaniu kwerendy.

Odpowiedz

-3

Nie jestem biegły w postgresql, więc nie jestem zaznajomiony z instrukcją "CREATE SEQUENCE". Sądzę jednak, że poprawnie dodajesz definicję kolumny. Jednak dodanie kolumny nie powoduje automatycznego wstawiania danych do istniejących wierszy. Ograniczenie DEFAULT dotyczy nowych wierszy. Spróbuj dodać coś podobnego, aby wypełnić dane w istniejących wierszach.

DECLARE @i Int 
SET @i = 0 
SET ROWCOUNT 1 
WHILE EXISTS (SELECT 1 FROM test WHERE rid IS NULL) BEGIN 
    UPDATE test SET rid = @i WHERE rid IS NULL 
END 
SET ROWCOUNT 0 
+0

Dzięki za urywek. Występują błędy składni podczas próby uruchomienia: 'at or near @'. Nie jestem zaznajomiony z definicją zmiennych w Postgreqsl, więc nie jestem pewien, czy jest coś oczywistego, co muszę zmienić. – djq

+0

(1) To wygląda jak składnia SQL Server lub prawdopodobnie MySQL, nie będzie działać w PostgreSQL. (2) To spowoduje pewne kłopoty, gdy tylko zostaną dodane nowe wiersze, ponieważ nie używasz wartości z sekwencji, następna wartość, która wyjdzie z sekwencji, będzie 1, nawet jeśli już to wykorzystałeś dla ' rid ". –

+0

Dobry połów, [mu jest zbyt krótki] (http://stackoverflow.com/users/479863/mu-is-too-short), o nie używaniu wartości sekwencji. I tak, jestem całkiem niezły w pisaniu kodu MS SQL Server (z którym chciałbym poradzić sobie z tym trochę inaczej) i wcale nie jestem zaznajomiony z PostgreSQL.Chodziło mi o różnicę między definiowaniem ograniczenia i jego zastosowaniem, co poprawiona odpowiedź wyjaśnia lepiej niż ja. –

37

Ustaw wartość domyślną, gdy dodasz nową kolumnę:

create sequence rid_seq; 
alter table test add column rid integer default nextval('rid_seq'); 

Zmiana domyślnej wartości dla istniejących kolumn nie zmienia istniejących danych, ponieważ baza danych nie ma możliwości dowiedzenia się, jakie wartości powinny być zmieniane ; nie ma flagi "ta kolumna ma wartość domyślną" na wartościach kolumn, jest tylko wartość domyślna (pierwotnie NULL, ponieważ nie podano nic więcej) i bieżąca wartość (również NULL), ale sposób odróżnienia wartości "NULL" ponieważ jest to wartość domyślna "i" NULL, ponieważ została jawnie ustawiona na NULL ". Tak więc, gdy robisz to w dwóch etapach:

  1. Dodaj kolumnę.
  2. Zmień domyślną wartość.

PostgreSQL nie zastosuje wartości domyślnej do właśnie dodanej kolumny. Jeśli jednak dodasz kolumnę i podasz wartość domyślną w tym samym czasie, PostgreSQL będzie wiedział, które wiersze mają domyślną wartość (wszystkie), aby mogła podać wartości w miarę dodawania kolumny.

Nawiasem mówiąc, prawdopodobnie chcesz NOT NULL w tej kolumnie TOO:

create sequence rid_seq; 
alter table test add column rid integer not null default nextval('rid_seq'); 

i jako a_horse_with_no_name notatki, jeśli masz zamiar używać tylko rid_seq na kolumnie test.rid wtedy chcieć set its owner column do test.rid tak, że zostanie usunięty sekwencja Jeśli kolumna jest usuwany:

alter sequence rid_seq owned by test.rid; 
+3

Prawdopodobnie chcesz również uczynić tę kolumnę "właścicielem" sekwencji, aby PostgreSQL wiedział, że należy do tej kolumny: 'alter sequence rid_sequence owner to test.rid' –

+0

czy możliwe jest dostosowanie wartości sekwencji, np." REQ0001-REQ000N "do istniejącej tabeli? – Angger

+0

@ Sekwencje w Afryce są numeryczne, więc nie do końca. Możesz go sfałszować, łącząc dwie kolumny lub łącząc ciąg z samodzielną sekwencją. –

1

PostgreSQL:

UPDATE your_table SET your_column = nextval('your_sequence') 
WHERE your_column IS NULL; 
Powiązane problemy