我必须更新类型" 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约束,我无法执行生成的查询。
有没有办法临时禁用约束,然后执行所有查询并在不放弃约束的情况下重新激活约束?
或者如果我必须首先删除所有约束,有没有办法在更新后再次设置它们?我不是数据库的创建者,所以我没有必要再次创建约束。
答案 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;
当我有所有查询时,我首先删除每个约束,更新表,然后执行查询以再次添加约束。工作得很完美!