PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Migrar a coluna de texto/bytea do PostgreSQL para um objeto grande?


Por que não usar apenas lo_from_bytea ?

Exemplo:
SELECT 'test'::text::bytea;
   bytea    
------------
 \x74657374
(1 row)

SELECT lo_from_bytea(0, 'test'::text::bytea);
 lo_from_bytea 
---------------
        274052
(1 row)

SELECT lo_get(274052);
   lo_get   
------------
 \x74657374
(1 row)

Então, para realmente mover (é melhor você ter um backup) os dados de texto para OIDs, você pode fazer o seguinte:
ALTER TABLE mytable ADD COLUMN value_lo OID;
UPDATE mytable SET value_lo = lo_from_bytea(0, value::bytea), value = NULL;
ALTER TABLE mytable DROP COLUMN value;
ALTER TABLE mytable RENAME COLUMN value_lo TO value;

...e, finalmente, como o PostgreSQL é um banco de dados MVCC e não exclui imediatamente todos os dados, você deve limpar as coisas com um VACUUM FULL ou um CLUSTER .