2011-03-11 33 views
50

ile ada göre kısıtlama kısıtlaması Postgresql'de bir adın adını bilmesiyle nasıl bir kısıtlama adı bırakabilirim? Üçüncü taraf bir komut dosyası tarafından otomatik olarak oluşturulmuş kısıtlamaların bir listesi var. Tablo adını sadece kısıtlama adını bilmeden bunları silmem gerek.Postgresql

SELECT * 
FROM information_schema.constraint_table_usage 
WHERE table_name = 'your_table' 

Alternatif

select n.nspname as schema_name, 
     t.relname as table_name, 
     c.conname as constraint_name 
from pg_constraint c 
    join pg_class t on c.conrelid = t.oid 
    join pg_namespace n on t.relnamespace = n.oid 
where t.relname = 'your_table_name'; 

Sonra gerekli ALTER TABLE deyimi çalıştırabilirsiniz bu bilgileri almak için pg_constraint kullanabilirsiniz:

+0

Hangi sürüm PG üzerindesiniz? – Kuberchaun

cevap

84

aşağıdaki sorguyu çalıştırarak tablo adlarını almak gerekir:

ALTER TABLE your_table DROP CONSTRAINT constraint_name; 

Elbette Sorgu tamamlandı alter deyimi dönüş yapabilir:

SELECT 'ALTER TABLE '||table_name||' DROP CONSTRAINT '||constraint_name||';' 
FROM information_schema.constraint_table_usage 
WHERE table_name in ('your_table', 'other_table') 

aynı tablolarla birden şemalar varsa WHERE yan tümcesinde table_schema (ve alter deyimi) eklemeyi unutmayın.

8

Eğer PG'inizin 9.x'inde ise, bunu çalıştırmak için DO ifadesini kullanabilirsiniz. Sadece a_horse_with_no_name'ın yaptığı şeyi yapın, ancak bunu bir DO bildirisine uygulayın.

DO $$DECLARE r record; 
    BEGIN 
     FOR r IN SELECT table_name,constraint_name 
       FROM information_schema.constraint_table_usage 
       WHERE table_name IN ('your_table', 'other_table') 
     LOOP 
      EXECUTE 'ALTER TABLE ' || quote_ident(r.table_name)|| ' DROP CONSTRAINT '|| quote_ident(r.constraint_name) || ';'; 
     END LOOP; 
    END$$; 
+0

+1, Mümkünse DO ifadesini kullanmak için iyi bir fikir –