4
我有一個SQL腳本,需要刪除幾個約束並在最後恢復它們,但約束名稱是自動生成的,並且每次腳本運行時都會有所不同。具有未知名稱的PostgreSQL丟棄約束
我知道如何從表名中獲取約束名,但在drop語句中使用這些信息似乎是不可能的。
select conname from pg_constraint where
conrelid = (select oid from pg_class where relname='table name')
and confrelid = (select oid from pg_class where relname='reference table');
alter table something drop constraint (some subquery)
是語法錯誤。
我非常希望得到約束名稱,並將其存儲在一個變量,但它似乎並不認爲Postgres的支持,我不能讓它用psql \set
工作。
這甚至可能嗎?
您*至少*需要動態SQL來執行此操作。對象名稱(表名,列名等)不能先指定爲變量(或子查詢),而不先構建查詢(以字符串形式),然後執行該查詢。使用sed/awk在文件中生成「DROP xxx」行,並通過psql管理該文件可能是一種解決方法。它仍然很難保持一些「原子性」(但DDL在這方面總是很困難) – wildplasser
@wildplasser好吧,我想也許psql會有一些功能來做到這一點。否則,你可以把你的評論作爲答案。 – takteek
我不是那麼隨意動態查詢建築物(其實我討厭它)其他人可能會填充它。 – wildplasser