Jak mogę usunąć nazwę ograniczenia w Postgresql po prostu znając nazwę? Mam listę ograniczeń, które są generowane automatycznie przez skrypt innej firmy. Muszę je usunąć bez znajomości nazwy tabeli, tylko nazwa ograniczenia.
postgresql
johnlemon
źródło
źródło
Odpowiedzi:
Musisz pobrać nazwy tabel, uruchamiając następujące zapytanie:
SELECT * FROM information_schema.constraint_table_usage WHERE table_name = 'your_table'
Alternatywnie możesz użyć
pg_constraint
do odzyskania tych informacjiselect 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';
Następnie możesz uruchomić wymaganą instrukcję ALTER TABLE:
ALTER TABLE your_table DROP CONSTRAINT constraint_name;
Oczywiście możesz sprawić, że zapytanie zwróci pełną instrukcję alter:
SELECT 'ALTER TABLE '||table_name||' DROP CONSTRAINT '||constraint_name||';' FROM information_schema.constraint_table_usage WHERE table_name in ('your_table', 'other_table')
Nie zapomnij dołączyć tabeli table_schema do klauzuli WHERE (i instrukcji ALTER), jeśli istnieje wiele schematów z tymi samymi tabelami.
źródło
Jeśli korzystasz z 9.x PG, możesz użyć instrukcji DO, aby to uruchomić. Po prostu zrób to, co zrobił a_horse_with_no_name, ale zastosuj to do instrukcji DO.
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$$;
źródło
- Usuń prawe ograniczenie klucza obcego
ALTER TABLE affiliations DROP CONSTRAINT affiliations_organization_id_fkey;
UWAGA:
przynależności -> Nazwa tabeli
affiliations_organization_id_fkey -> Nazwa przeszkody
źródło