如何僅通過知道名稱就可以在Postgresql中放置約束名稱? 我有一個由第三方腳本自動生成的約束列表。我需要刪除它們而不知道表名只是約束名稱。在Postgresql中通過名稱放置約束條件
50
A
回答
84
您需要通過運行下面的查詢檢索表名:
SELECT *
FROM information_schema.constraint_table_usage
WHERE table_name = 'your_table'
或者您可以使用pg_constraint
檢索這些信息
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';
然後你可以運行所需的ALTER TABLE語句:
ALTER TABLE your_table DROP CONSTRAINT constraint_name;
當然您可以查詢返回完整的ALTER語句:
SELECT 'ALTER TABLE '||table_name||' DROP CONSTRAINT '||constraint_name||';'
FROM information_schema.constraint_table_usage
WHERE table_name in ('your_table', 'other_table')
不要忘了,包括在WHERE子句中的TABLE_SCHEMA(和ALTER聲明)是否有與同一表的多個模式。
8
如果你在PG的9.x上,你可以使用DO語句來運行它。只要做一下a_horse_with_no_name做的事情,但將它應用到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$$;
+0
+1,如果可能,最好使用DO語句 – 2011-03-11 14:24:39
相關問題
- 1. 通過約束名稱獲取表名
- 2. POSTGRESQL的約束條件
- 3. 通過遷移更改約束名稱
- 4. 如何在postgreSQL中設置條件約束
- 5. PostgreSQL的:有條件的唯一約束
- 6. Postgresql:有條件的唯一約束
- 7. 在代碼中設置約束條件
- 8. 在Adobe Illustrator中設置約束條件
- 9. 約束表列名(postgresql)
- 10. 按約束條件過濾
- 11. 從不同的查詢中收到的約束條件名稱
- 12. 如何獲取postgresql中唯一約束的名稱?
- 13. 具有相同約束名稱,不同名稱空間的多個約束條件
- 14. 無法在Postgresql中添加約束條件
- 15. 在postgresql中結合了唯一性和排除約束條件
- 16. Postgresql約束
- 17. NHibernate - 名稱主鍵約束?
- 18. 約束名稱被忽略
- 19. 約束種:通過多個約束
- 20. SQLServer2000約束條件
- 21. UITableViewCell約束條件
- 22. 具有未知名稱的PostgreSQL丟棄約束
- 23. PostgreSQL:約束名稱不一定是唯一的
- 24. 通用佈局約束條件
- 25. C#的通用約束條件
- 26. PostgreSQL連接約束
- 27. PostgreSQL檢查約束
- 28. 試圖修改PostgreSQL中的約束條件
- 29. Rails 3中的Postgresql參照完整性約束條件
- 30. PostgreSQL中函數參數的約束條件
你在什麼版本的PG上? – Kuberchaun 2011-03-11 14:12:26