Mam tabelę z istniejącymi danymi. Czy istnieje sposób na dodanie klucza podstawowego bez usuwania i ponownego tworzenia tabeli?
190
Mam tabelę z istniejącymi danymi. Czy istnieje sposób na dodanie klucza podstawowego bez usuwania i ponownego tworzenia tabeli?
( Zaktualizowano - Dzięki osobom, które skomentowały )
Załóżmy, że masz tabelę o nazwie test1
, do której chcesz dodać id
kolumnę z automatycznym zwiększaniem, kluczem podstawowym (zastępczym). W najnowszych wersjach PostgreSQL powinno wystarczyć następujące polecenie:
ALTER TABLE test1 ADD COLUMN id SERIAL PRIMARY KEY;
W starych wersjach PostgreSQL (przed wersją 8.x?) Trzeba było wykonać całą brudną robotę. Następująca sekwencja poleceń powinna załatwić sprawę:
ALTER TABLE test1 ADD COLUMN id INTEGER;
CREATE SEQUENCE test_id_seq OWNED BY test1.id;
ALTER TABLE test ALTER COLUMN id SET DEFAULT nextval('test_id_seq');
UPDATE test1 SET id = nextval('test_id_seq');
Ponownie, w ostatnich wersjach Postgres jest to mniej więcej odpowiednik pojedynczego polecenia powyżej.
ADD PRIMARY KEY
tworzy równieżNOT NULL
ograniczenie (testowane w Postgresie 9.3) zgodnie z oczekiwaniami i oczekiwaniami.ALTER TABLE test1 ADD COLUMN id SERIAL PRIMARY KEY;
To wszystko, czego potrzebujesz:
id
kolumnęPodziękowania należą się @resnyanskiy, który udzielił odpowiedzi w komentarzu.
źródło
ALTER TABLE <table> DROP CONSTRAINT <pkey_name>;
Aby użyć kolumny tożsamości w wersji 10,
Aby uzyskać wyjaśnienie kolumn tożsamości, zobacz https://blog.2ndquadrant.com/postgresql-10-identity-columns/ .
Różnicę między WYTWORZONYM PRZEZ DOMYŚLNĄ a ZAWSZE WYTWORZONĄ, patrz https://www.cybertec-postgresql.com/en/sequences-gains-and-pitfalls/ .
Aby zmienić sekwencję, patrz https://popsql.io/learn-sql/postgresql/how-to-alter-sequence-in-postgresql/ .
źródło
SQL Error [23502]: ERROR: column "id" contains null values
Wylądowałem tutaj, bo też szukałem czegoś takiego. W moim przypadku kopiowałem dane z zestawu tabel pomostowych z wieloma kolumnami do jednej tabeli, jednocześnie przypisując identyfikatory wierszy do tabeli docelowej. Oto wariant powyższych podejść, których użyłem. Dodałem kolumnę szeregową na końcu mojej tabeli docelowej. W ten sposób nie muszę mieć symbolu zastępczego w instrukcji Insert. Następnie prosty wybór * w tabeli docelowej automatycznie wypełnił tę kolumnę. Oto dwie instrukcje SQL, których użyłem w PostgreSQL 9.6.4.
źródło