Bir joker karakter kullanarak PostgreSQL'de birden çok tablo nasıl bırakılır


84

Bölümlerle çalışırken, genellikle tüm bölümleri bir kerede silmeye ihtiyaç vardır.

ancak

DROP TABLE tablename*

Çalışmıyor. (Joker karaktere saygı gösterilmez).

Joker karakterle birden çok tabloyu tek bir komutta bırakmanın zarif (okuma: hatırlaması kolay) bir yolu var mı?

Yanıtlar:


117

Virgülle ayrılmış bir liste kullanın:

DROP TABLE foo, bar, baz;

Gerçekten bir tabancaya ihtiyacınız varsa, bu işini yapacak:

CREATE OR REPLACE FUNCTION footgun(IN _schema TEXT, IN _parttionbase TEXT) 
RETURNS void 
LANGUAGE plpgsql
AS
$$
DECLARE
    row     record;
BEGIN
    FOR row IN 
        SELECT
            table_schema,
            table_name
        FROM
            information_schema.tables
        WHERE
            table_type = 'BASE TABLE'
        AND
            table_schema = _schema
        AND
            table_name ILIKE (_parttionbase || '%')
    LOOP
        EXECUTE 'DROP TABLE ' || quote_ident(row.table_schema) || '.' || quote_ident(row.table_name);
        RAISE INFO 'Dropped table: %', quote_ident(row.table_schema) || '.' || quote_ident(row.table_name);
    END LOOP;
END;
$$;

SELECT footgun('public', 'tablename');

3
Cevabın için teşekkür ederim! Virgülle ayrılmış bir liste, küçük bir tablo listesini kaldırmak için harikadır. Ancak, aynı anda (veya daha fazla) 20 tabloyu düşürmek pratik değildir. Daha net olması için soruyu yeniden odaklayacağım.
Tom Feiner

2
Üzgünüm, sahip olduğunuz tek seçenek bu. Bunun için depolanmış bir işlev oluşturabilirsiniz, ancak kendinizi ayağınızdan
vurmanız

4
İşlev eklendi, iyi eğlenceler! Dikkatli olun, bu, tüm veritabanınızı yok edebilir.
Frank Heikens

sadece bir eksik || ' CASCADE ';ve mükemmel
MFARID

28

İşte bu soruna başka bir hileli cevap. Çalışır ubuntuve belki başka bir işletim sistemi de çalışır. Bir yapmak \dtPostgres'e içinde komut istemi (komut istemi içine koşuyordu genome-terminalbenim durumumda). Ardından terminalde çok sayıda tablo göreceksiniz. Şimdi tüm tabloların adlarını kopyalamak için ctrl+click-dragişlevini kullanın genome-terminal. görüntü açıklamasını buraya girinPython'u açın, biraz dize işleme yapın ('' yerine '' ve ardından '\ n' yerine ',') ve tüm tabloların virgülle ayrılmış listesini alırsınız. Şimdi psql kabuğunda bir yapın drop table CTRL+SHIFT+Vve bitirdiniz. Sadece paylaşmak istediğim çok özel olduğunu biliyorum. :)


Bu harika çalışıyor, ne yapmak istediğiniz konusunda kolayca açık olmanızı sağlıyor.
Brad Koch

5
Yaptığım şey benzer, yazıyorum: DROP TABLE whatever_ve sonra SEKME tuşuna basın, tüm tabloları panoya kopyalayın, sublime'ı açın, Bul / Değiştir ve Normal İfadeleri kullanarak değiştirin, terminal \s+için ,yapıştırın.
Alfonso Pérez

evet, bu 5 ila birçok tablo içindir. uzun bir liste için tablo adları için bir sorgu çalıştırın, kullanarak psql'den düzenleyicinize \eatın, listenizi kopyalayın ve virgül koyun.
Merlin

Ayrıca, pgadmin3'te şema adını seçip 'Bağımlılar' sekmesine giderseniz, tüm tabloları seçebilir (shift tuşunu kullanarak) ve sonra hepsini CTRL + C kullanarak kopyalayabilirsiniz. isim, ..] sorgu.
Mate Šimović

18

Bunu kullandım.

echo "select 'drop table '||tablename||';' from pg_tables where tablename like 'name%'" | \
    psql -U postgres -d dbname -t | \
    psql -U postgres -d dbname

İçin uygun değerlerde değiştirin dbnameve name%.


14

Her zaman bir sql betiği oluştururken, onu çalıştırmadan önce plpgsql'yi doğru bir şekilde almaya güvenmek yerine inceleyip test edebileceğimi hissettim, böylece veritabanımı uçurmaz. Bash'da katalogdan tablo adlarını seçen ve ardından benim için drop ifadelerini oluşturan basit bir şey. Yani 8.4.x için şu temel sorguyu alırsınız:

SELECT 'drop table '||n.nspname ||'.'|| c.relname||';' as "Name" 
FROM pg_catalog.pg_class c
     LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
WHERE c.relkind IN ('r','v','S','')
     AND n.nspname <> 'pg_catalog'
     AND n.nspname <> 'information_schema'
     AND n.nspname !~ '^pg_toast'
AND pg_catalog.pg_table_is_visible(c.oid);

Bir where cümlesi ekleyebilirsiniz. ( where c.relname ilike 'bubba%')

Çıktı şuna benzer:

         Name          
-----------------------
 drop table public.a1;
 drop table public.a2;

Bunu bir .sql dosyasına kaydedin ve psql -f dosyaadı.sql ile çalıştırın.


Bir takip olarak, silinmesi gereken tüm tabloları aynı şemaya koyarsanız, bunu cascade ile bırakabilirsiniz: drop schema abc cascade;
Scott Marlowe

Bu sorgunun ayrıca drop tablebulduğu herhangi Sıralar ( relkind = 'S') için bir komut üreteceğini unutmayın . drop tablebir dizide başarısız olur. Bunun yerine, kaldırmak 'S'gelen relkind INfıkra. Dizileri bırakmanız gerekiyorsa, sabit verilerle benzer bir sorgu oluşturun select 'drop sequence', bu seferc.relkind = 'S'
mrjmh

9

Açıklama: Bu cevap Linux kullanıcıları içindir.

@Prongs'un söylediklerine biraz daha özel talimatlar eklerdim:

  • \dtjoker karakterleri destekleyebilir: böylece \dt myPrefix*örneğin, yalnızca kaldırmak istediğiniz tabloları seçmek için çalıştırabilirsiniz ;
  • sonra CTRL-SHIFT-DRAGsonra seçmek için CTRL-SHIFT-Cmetin kopyalamak için;
  • içinde vim, gidin INSERT MODEve tabloları yapıştırın CTRL-SHIFT-V;
  • tuşuna basın ESC, ardından :%s/[ ]*\n/, /gvirgülle ayrılmış listeye çevirmek için çalıştırın , ardından bunu (son virgül hariç) içine yapıştırabilirsiniz DROP TABLE % CASCADE.

3

Linux komut satırı araçlarını kullanarak şu şekilde yapılabilir:

psql -d mydb -P tuples_only=1 -c '\dt' | cut -d '|' -f 2 | paste -sd "," | sed 's/ //g' | xargs -I{} echo psql -d mydb -c "drop table {};"

NOT: Son yankı oradadır çünkü drop komutunun etrafına tırnak işareti koymanın bir yolunu bulamadım, bu yüzden çıktıyı kopyalayıp yapıştırmanız ve tırnakları kendiniz eklemeniz gerekir.

Bu küçük sorunu çözebilecek biri varsa, bu harika bir sos olur.


1

Bu yüzden bugün bu problemle karşılaştım. Sunucu veritabanımı pgadmin3 üzerinden yükledim ve bu şekilde yaptım. Tablolar alfabetik olarak sıralanmıştır, bu nedenle kaydırma ve tıklama ve ardından silme işlemi iyi çalışır.


Bunu yapabilirsiniz, ancak 'Özellikler' penceresini kullanmanız gerekir
Mat
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.