2011-03-11 58 views

回答

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