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:
- Dodaj kolumnę.
- 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;
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
(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 ". –
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. –