Przed przebudową regularnie muszę usuwać wszystkie dane z mojej bazy danych PostgreSQL. Jak mam to zrobić bezpośrednio w SQL?
W tej chwili udało mi się wymyślić instrukcję SQL, która zwraca wszystkie polecenia, które muszę wykonać:
SELECT 'TRUNCATE TABLE ' || tablename || ';' FROM pg_tables WHERE tableowner='MYUSER';
Ale nie widzę sposobu na ich programowe wykonanie, gdy już je mam.
DECLARE r RECORD;
potem na pętlę:FOR r IN SELECT tablename FROM pg_tables LOOP
W plpgsql rzadko potrzebne są jawne kursory. Za pomocą prostsze i szybsze niejawny wskaźnik o
FOR
pętli:Uwaga: Ponieważ nazwy tabel nie są unikalne dla każdej bazy danych, dla pewności należy kwalifikować nazwy tabel według schematu. Ograniczam również funkcję do domyślnego schematu „public”. Dostosuj się do swoich potrzeb, ale pamiętaj o wykluczeniu schematów systemowych
pg_*
iinformation_schema
.Zachowaj ostrożność podczas korzystania z tych funkcji. Niszczą twoją bazę danych. Dodałem zabezpieczenie przed dziećmi. Skomentuj
RAISE NOTICE
linię i usuń komentarz,EXECUTE
aby zalać bombę ...format()
wymaga Postgres 9.1 lub nowszego. W starszych wersjach połącz ciąg zapytania w następujący sposób:Pojedyncze polecenie, bez pętli
Ponieważ możemy
TRUNCATE
jednocześnie wiele tabel, nie potrzebujemy żadnego kursora ani pętli:Zgromadź wszystkie nazwy tabel i wykonaj jedną instrukcję. Prostsze, szybsze:
Połączenie:
Udoskonalone zapytanie
Nie potrzebujesz nawet funkcji. W Postgres 9.0+ możesz wykonywać dynamiczne polecenia w
DO
instrukcji. A w Postgres 9.5+ składnia może być jeszcze prostsza:O różnicy między
pg_class
,pg_tables
orazinformation_schema.tables
:Informacje
regclass
i cytowane nazwy tabel:Do wielokrotnego użytku
Utwórz bazę danych „szablonu” (nazwijmy ją
my_template
) ze swoją strukturą waniliową i wszystkimi pustymi tabelami. Następnie przejdź przezDROP
/CREATE DATABASE
cykl:Jest to niezwykle szybkie , ponieważ Postgres kopiuje całą strukturę na poziomie pliku. Żadnych problemów ze współbieżnością ani innych kosztów ogólnych, które spowalniają.
Jeśli równoczesne połączenia uniemożliwiają porzucenie bazy danych, rozważ:
źródło
DROP DATABASE mydb
, oczywiście). Może mylisz schematy z bazami danych?DO
Poleceń (jak każdy inny SQL) jest wykonywana w bieżącej bazie danych wyłącznie . Postgres nie ma możliwości dostępu do innych baz danych w tej samej transakcji. Aby to zrobić, musiałbyś użyć dblink lub FDW. Ale ma to wpływ na wszystkie schematy w bieżącej bazie danych - chyba że dodasz,WHERE t.schemaname = 'public'
aby ograniczyć efekt do jednego konkretnego schematu w tym konkretnym przypadku.Jeśli muszę to zrobić, po prostu utworzę schemat sql bieżącej bazy danych, a następnie upuść i utworzę bazę danych, a następnie załaduję bazę danych za pomocą schematu sql.
Poniżej znajdują się wymagane kroki:
1) Utwórz zrzut schematu bazy danych (
--schema-only
)pg_dump mydb -s > schema.sql
2) Drop bazy danych
drop database mydb;
3) Utwórz bazę danych
create database mydb;
4) Importuj schemat
psql mydb < schema.sql
źródło
W takim przypadku prawdopodobnie lepiej byłoby mieć po prostu pustą bazę danych, której używasz jako szablonu, a gdy musisz odświeżyć, usuń istniejącą bazę danych i utwórz nową z szablonu.
źródło
Czy mógłbyś użyć dynamicznego SQL do wykonywania każdej instrukcji po kolei? Aby to zrobić, prawdopodobnie musiałbyś napisać skrypt PL / pgSQL.
http://www.postgresql.org/docs/8.3/static/plpgsql-statements.html (sekcja 38.5.4. Wykonywanie poleceń dynamicznych)
źródło
Możesz to zrobić również za pomocą basha:
Będziesz musiał dostosować nazwy schematów, hasła i nazwy użytkowników, aby pasowały do twoich schematów.
źródło
AUTO_INCREMENT
Wersja czyszcząca :źródło
Chłopaki, lepszym i czystszym sposobem jest:
1) Utwórz zrzut schematu bazy danych (--schema-only) pg_dump mydb -s> schema.sql
2) Drop bazy danych drop bazy danych mydb;
3) Utwórz bazę danych stwórz bazę danych mydb;
4) Importuj schemat psql mydb <schema.sql
Na mnie to działa!
Miłego dnia. Hiram Walker
źródło
Jeśli możesz użyć psql , możesz użyć
\gexec
polecenia meta do wykonania zapytania;Zwróć uwagę, że
\gexec
zostało wprowadzone w wersji 9.6źródło
Aby usunąć dane i zachować struktury tabel w pgAdmin , możesz wykonać:
źródło