暂时停用更新PK和FK数据类型的约束

时间:2017-08-02 12:21:10

标签: postgresql constraints

我必须更新类型" uuid"的所有列。 to" varchar(38)"。我用以下方法创建了所有必要的查询:

SELECT format(
  'ALTER TABLE %I.%I.%I ALTER COLUMN %I SET DATA TYPE varchar(38);',
  table_catalog,
  table_schema,
  table_name,
  column_name
)
FROM information_schema.columns
WHERE data_type = 'uuid'
  AND table_schema NOT LIKE 'pg_%'
  AND lower(table_schema) <> 'information_schema'
  AND is_updatable = 'YES';

显然,由于涉及uuid列的所有现有PK和FK约束,我无法执行生成的查询。
有没有办法临时禁用约束,然后执行所有查询并在不放弃约束的情况下重新激活约束? 或者如果我必须首先删除所有约束,有没有办法在更新后再次设置它们?我不是数据库的创建者,所以我没有必要再次创建约束。

1 个答案:

答案 0 :(得分:0)

我找到了一种方法来创建所有查询以删除和创建数据库的所有约束 所以首先我必须保存第一个查询的输出

SELECT 'ALTER TABLE "'||nspname||'"."'||relname||'" DROP CONSTRAINT "'||conname||'";'
 FROM pg_constraint 
 INNER JOIN pg_class ON conrelid=pg_class.oid 
 INNER JOIN pg_namespace ON pg_namespace.oid=pg_class.relnamespace 
 ORDER BY CASE WHEN contype='f' THEN 0 ELSE 1 END,contype,nspname,relname,conname;

和第二个查询

SELECT 'ALTER TABLE "'||nspname||'"."'||relname||'" ADD CONSTRAINT "'||conname||'" "'||
   pg_get_constraintdef(pg_constraint.oid)||'";'
 FROM pg_constraint
 INNER JOIN pg_class ON conrelid=pg_class.oid
 INNER JOIN pg_namespace ON pg_namespace.oid=pg_class.relnamespace
 ORDER BY CASE WHEN contype='f' THEN 0 ELSE 1 END DESC,contype DESC,nspname DESC,relname DESC,conname DESC;

当我有所有查询时,我首先删除每个约束,更新表,然后执行查询以再次添加约束。工作得很完美!