Mam tabelę z ponad milionem wierszy. Muszę zresetować sekwencję i ponownie przypisać kolumnę id z nowymi wartościami (1, 2, 3, 4 ... itd.). Czy jest to łatwy sposób?
postgresql
sequence
sennin
źródło
źródło
id
czy tam nie zaczynał się od 1. Więc kolejność wyglądała następująco: 150, 151 ..., 300, 1, 2 ... I przypuszczam, że w końcu spowodowałoby to zduplikowane błędy id, gdybym nie zmienił numeracji identyfikatory. Ponadto sortowanie wedługid
jest na ogół lepsze niż sortowanie wedługcreated_at
. Oto, co zadziałało dla mnie .Odpowiedzi:
Jeśli nie chcesz zachować kolejności identyfikatorów, możesz
Wątpię, aby można było to łatwo zrobić w wybranej przez siebie kolejności bez odtwarzania całego stołu.
źródło
ALTER SEQUENCE seq RESTART WITH 1;
?SELECT setval('seq', 1, FALSE)
powinien zrobić to samo (tutaj trzeci argument, FALSE, robi magię, ponieważ pokazuje, żenextval
musi to być 1 zamiast 2)Z PostgreSQL 8.4 lub nowszym nie ma już potrzeby określania
WITH 1
. Użyta zostanie wartość początkowa, która została zapisana przezCREATE SEQUENCE
lub ostatnio ustawiona przezALTER SEQUENCE START WITH
(najprawdopodobniej będzie to 1).Zresetuj sekwencję:
Następnie zaktualizuj kolumnę ID tabeli:
Źródło: Dokumenty PostgreSQL
źródło
Zresetuj sekwencję:
Aktualizacja aktualnych rekordów:
źródło
serial
iCREATE SEQUENCE
wynosi 1!)Oba podane rozwiązania nie działały u mnie;
setval('seq', 1)
rozpoczyna numerację od 2, a takżeALTER SEQUENCE seq START 1
rozpoczyna numerację od 2, ponieważ seq.is_called ma wartość true (Postgres wersja 9.0.4)Rozwiązanie, które zadziałało dla mnie to:
źródło
Tylko dla uproszczenia i wyjaśnienia prawidłowego użycia ALTER SEQUENCE i SELECT setval do resetowania sekwencji:
jest równa
Każda z instrukcji może zostać użyta do zresetowania sekwencji, a następną wartość można uzyskać za pomocą funkcji nextval („nazwa_sekwencji”), jak również podano tutaj :
źródło
Najlepszym sposobem na zresetowanie sekwencji, aby rozpocząć od numeru 1, jest wykonanie następujących czynności:
Na przykład dla tabeli użytkowników byłoby to:
źródło
Aby zachować kolejność rzędów:
źródło
FYI: Jeśli chcesz określić nową wartość początkową z zakresu identyfikatorów (na przykład 256 - 10000000):
źródło
Samo zresetowanie sekwencji i zaktualizowanie wszystkich wierszy może spowodować powielenie błędów identyfikatora. W wielu przypadkach musisz dwukrotnie zaktualizować wszystkie wiersze. Najpierw z wyższymi identyfikatorami, aby uniknąć duplikatów, a następnie z identyfikatorami, które faktycznie chcesz.
Unikaj dodawania stałej kwoty do wszystkich identyfikatorów (zgodnie z zaleceniami w innych komentarzach). Co się stanie, jeśli masz więcej wierszy niż ta stała kwota? Zakładając, że następna wartość sekwencji jest wyższa niż wszystkie identyfikatory istniejących wierszy (chcesz tylko wypełnić luki), zrobiłbym to tak:
źródło
W moim przypadku osiągnąłem to dzięki:
Gdzie moja tabela nazywa się table
źródło
Zainspirowany innymi odpowiedziami tutaj, stworzyłem funkcję SQL do wykonywania migracji sekwencji. Funkcja przenosi sekwencję kluczy podstawowych do nowej, ciągłej sekwencji, zaczynając od dowolnej wartości (> = 1) w obrębie lub poza istniejącym zakresem sekwencji.
Wyjaśniam tutaj, jak wykorzystałem tę funkcję do migracji dwóch baz danych z tym samym schematem, ale różnymi wartościami do jednej bazy danych.
Najpierw funkcja (która wyświetla wygenerowane polecenia SQL, aby było jasne, co się właściwie dzieje):
Funkcja
migrate_pkey_sequence
przyjmuje następujące argumenty:arg_table
: nazwa tabeli (np.'example'
)arg_column
: nazwa kolumny klucza podstawowego (np.'id'
)arg_sequence
: nazwa sekwencji (np.'example_id_seq'
)arg_next_value
: następna wartość dla kolumny po migracjiWykonuje następujące operacje:
nextval('example_id_seq')
następuje tomax(id)
i że sekwencja zaczyna się od 1. Dotyczy to również przypadku, w którymarg_next_value > max(id)
.arg_next_value
. Kolejność kluczowych wartości jest zachowana, ale dziury w zakresie nie są zachowywane.Aby zademonstrować, używamy sekwencji i tabeli zdefiniowanych w następujący sposób (np. Używając
psql
):Następnie wstawiamy kilka wartości (zaczynając na przykład od 3):
Na koniec migrujemy
example.id
wartości, aby rozpocząć od 1.Wynik:
źródło
Nawet kolumna autoinkrementacji nie jest PK (w tym przykładzie nazywa się seq - inaczej sekwencja), można to osiągnąć za pomocą wyzwalacza:
DROP TABLE, JEŚLI ISTNIEJE devops_guide KASKADA;
źródło
Jeśli używasz pgAdmin3, rozwiń „Sekwencje”, kliknij prawym przyciskiem myszy sekwencję, przejdź do „Właściwości”, a na karcie „Definicja” zmień „Wartość bieżąca” na dowolną wartość. Nie ma potrzeby zadawania pytań.
źródło