Soru PostgreSQL'deki tüm tabloları bırak?


PostgreSQL'deki tüm tabloları komut satırından nasıl çalıştırabilirim?

ben yapamaz veritabanının kendisini, sadece tüm tabloları ve bunların içindeki tüm verileri bırakmak istiyorum.


723
2017-07-24 23:24


Menşei


Hangi komuttan bahsediyorsun? Hepimiz biliyoruz ki bir Windows PowerShell uygulaması arıyoruz. - Greg Smith
Afedersiniz. Unix'te, komut satırında 'psql' yazdıktan sonra - psql komut satırı ortamının kendisi. - AP257
DAMLA SCHEMA kamu CASCADE; - titreme - wildplasser
@ 0Fnt 'SCHEMA halkını CREATE yapmalısınız'; tekrar yeni tablolar eklemek (zor yoldan öğrendim) - nym
BTW, düştüğünde publicYüklü uzantıları kaybedersiniz. - sudo


Cevaplar:


Tüm tablolarınız tek bir şemadaysa, bu yaklaşım işe yarayabilir (aşağıdaki kod şemanınızın adının olduğunu varsayar). public)

DROP SCHEMA public CASCADE;
CREATE SCHEMA public;

PostgreSQL 9.3 veya daha üstünü kullanıyorsanız, ayrıca varsayılan hibeleri de geri yüklemeniz gerekebilir.

GRANT ALL ON SCHEMA public TO postgres;
GRANT ALL ON SCHEMA public TO public;

1030
2017-12-11 15:52



Bunun, genel şemada tanımlanan tüm işlevleri, görünümleri vb. De sileceğini unutmayın. - Brad Koch
Bunun sistem tablolarını kaldırmayacağını unutmayın. pg_) farklı bir şemada oldukları gibi, pg_catalog. - congusbongus
Bu, psql olarak oturum açtığınız kullanıcıya ayarlanan şema / OWNER şemasını oluşturacaktır. Bu, farklı bir kullanıcı olarak giriş yapan uygulamalarla çakışır. Bu durumda, ayrıca "ALTER SCHEMA public OWNER, postgres'e" gerek duyuyorsunuz. (veya uygulamanızın tablo oluşturmak için kullandığı her kullanıcı için) - mgojohn
Bunu başka bir cevaptan çıkarmak muhtemelen bir GRANT ALL ON SCHEMA public TO public; oluşturduktan sonra. - Federico
@Federico Neden istersiniz GRANT ALL oluşturduktan sonra? - 425nesp


Böyle bir SQL komut dosyası oluşturmak için bir sorgu yazabilirsiniz:

select 'drop table "' || tablename || '" cascade;' from pg_tables;

Veya:

select 'drop table if exists "' || tablename || '" cascade;' from pg_tables;

Bir önceki cümledeki basamaklı seçenek nedeniyle bazı tabloların otomatik olarak düşmesi durumunda.

Ayrıca, yorumlarda belirtildiği gibi, şema adına göre bırakmak istediğiniz tabloları filtrelemek isteyebilirsiniz:

select 'drop table if exists "' || tablename || '" cascade;' 
  from pg_tables
 where schemaname = 'public'; -- or any other schema

Ve sonra koş.

Şanlı KOPYA + PASTE de çalışacaktır.


287
2017-07-24 23:29



Bence böyle demek istedin: Böyle bir sorgu yazabilirsin ... ... ve sonra da sorgunun çıktısını çalıştır. - Vinko Vrsalovic
Doğru. Demek istediğim şey o. :-) - Pablo Santa Cruz
'Varsa tablo bırak' seçeneğini seçin '' || tablename || '' cascade; ' pg_tables'den; Büyük harfli tabloların da düzgün bir şekilde düştüğünden emin olun. - Ivo van der Wijk
LenW'nin cevabına eklediği "schemaname = 'public'" cümlesi, silme kapsamını yalnızca sisteminizin değil, yönettiğiniz veritabanına indirgemek için çok yararlı olabilir. - Guillaume Gendre
@jwg: ayrıca, çünkü bazen izniniz yok drop schema public cascade;Ancak, hemen hemen her zaman tabloları bırakma izniniz vardır. - berkes


Bu yazının en çok kabul gören cevabı (Ocak 2014):

drop schema public cascade;
create schema public;

Bu işe yarıyor, ancak amacınız kamusal şemayı kendi saf haline geri yüklemekse, bu görevini tam olarak gerçekleştiremez. PostgreSQL 9.3.1 için pgAdmin III altında, bu şekilde oluşturulan "genel" şemaya tıklarsanız ve "SQL bölmesine" bakarsanız aşağıdakileri görürsünüz:

-- Schema: public

-- DROP SCHEMA public;

CREATE SCHEMA public
  AUTHORIZATION postgres;

Ancak, aksine, yepyeni bir veritabanı aşağıdakilere sahip olacaktır:

-- Schema: public

-- DROP SCHEMA public;

CREATE SCHEMA public
  AUTHORIZATION postgres;

GRANT ALL ON SCHEMA public TO postgres;
GRANT ALL ON SCHEMA public TO public;
COMMENT ON SCHEMA public
  IS 'standard public schema';

Benim için eski veritabanı problemlerini kullanarak veritabanı tabloları (web2py) oluşturan bir python web frameworkünü kullanarak:

<class 'psycopg2.ProgrammingError'> no schema has been selected to create in 

Yani aklımda tam olarak doğru cevap:

DROP SCHEMA public CASCADE;
CREATE SCHEMA public;
GRANT ALL ON SCHEMA public TO postgres;
GRANT ALL ON SCHEMA public TO public;
COMMENT ON SCHEMA public IS 'standard public schema';

(Ayrıca, bu komutları pgAdmin III'ten çıkarmaya da dikkat edin, Plugins-> PSQL Konsoluna gittim)


217
2018-01-21 00:38



Onaylandı. İki hat çözümü (drop sonra create) PostgreSQL 9.1 üzerinde çalışıyordu. 9.3'e yükseldikten sonra, iki ekstra grant gerekli. - Jinghao Shi
Bir tane daha onaylayın: Django kullanarak, aynı hatayı aldım; Django veritabanına girmeden önce bu hibeleri çalıştırmam gerekiyordu. - rjh
Bu, mükemmel bir şekilde çalıştı, ancak bazı uzantıları yeniden yüklemem gerekiyordu: CREATE EXTENSION, EXITS hstore; Pgcrypto OLMADIĞINDA UZATMA OLUŞTURUN; - shacker


İle tüm tabloları bırakabilirsiniz

DO $$ DECLARE
    r RECORD;
BEGIN
    -- if the schema you operate on is not "current", you will want to
    -- replace current_schema() in query with 'schematodeletetablesfrom'
    -- *and* update the generate 'DROP...' accordingly.
    FOR r IN (SELECT tablename FROM pg_tables WHERE schemaname = current_schema()) LOOP
        EXECUTE 'DROP TABLE IF EXISTS ' || quote_ident(r.tablename) || ' CASCADE';
    END LOOP;
END $$;

IMO bu daha iyidir drop schema publicçünkü yeniden yaratmanız gerekmez schema ve tüm hibeleri geri yükleyin.

Bunun harici kodlama dili gerektirmediği veya oluşturulan SQL'in kopyalayıcısını tekrar yorumlayıcısına gerek duymadığı ek ikramiye.


80
2018-03-15 22:21



NB: Eğer kopyalayıp yapıştırırsanız psql eklemek ; sonunda - igo
@igo, teşekkürler, kodu güncelledim. - Piotr Findeisen
Bunu gönderdiğiniz için teşekkürler! Kullanamadım drop schema Kullanıcı sadece şemaların sahibi olmadığı için hile yaptı. Bu çalıştı ama :) - vdboor
Bu kabul edilen cevap imho olmalı. Teşekkürler :) - Sankar
Çok temiz ve özel ... mükemmel çözüm ve kabul edilmiş olmalı - nereye eklemek istediğiniz PostGIS gibi uzantılar gibi ihtiyaç duyduğunuz tabloları sınırlamak için bile ekleyebilirsiniz ... - DPSSpatial


Yukarıdaki Pablo'ya göre, duruma göre belirli bir şemadan ayrılmak için:

select 'drop table "' || tablename || '" cascade;' 
from pg_tables where schemaname = 'public';

62
2018-05-01 06:27





Düşmek istediğiniz her şey ise Sahip olunan Aynı kullanıcı tarafından, sonra kullanabilirsiniz:

drop owned by the_user;

Değiştirmelisin the_user gerçek kullanıcı adıyla, şu anda "geçerli kullanıcı" için her şeyi bırakma seçeneği yoktur. Yaklaşan 9.5 sürümü seçeneği olacak drop owned by current_user.

Bu, aynı zamanda gerçekleşmiş görünümleri, görünümleri, dizileri, tetikleyicileri, şemaları, işlevleri, türleri, kümeleri, operatörleri, alanları ve benzeri bırakacaktır (=her şey) bu the_user sahip (= oluşturulmuş).

Kılavuzdaki daha fazla ayrıntı: http://www.postgresql.org/docs/current/static/sql-drop-owned.html


59
2017-12-01 07:17



Bu, kullanıcı tarafından sahip olunan tüm şemaları düşürdü (bunu yapmak istemedim). - Peter L
@PeterL: Bu kılavuzda açıkça belirtilmiştir, ancak "her şey" in gerçekten anlamına geldiğini açıklamak için yayınımı düzenledim her şey - a_horse_with_no_name


drop schema public cascade;

hile yapmalı.


36
2017-10-27 21:11



Bunun, genel şemada tanımlanan tüm işlevleri, görünümleri vb. De sileceğini unutmayın. - Joe Van Dyk
Ayrıca tabloları tekrar eklemek için daha sonra yeniden oluşturmalısınız CREATE SCHEMA public;. Ayrıca bkz. stackoverflow.com/a/14286370 daha fazla bilgi için - mikermcneil