PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Migrare la colonna di testo/bytea di PostgreSQL su un oggetto di grandi dimensioni?

Perché non usare semplicemente lo_from_bytea ?

Esempio:

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)

Quindi, per spostare effettivamente (è meglio che tu abbia un backup) i dati dal testo agli OID, puoi fare quanto segue:

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 infine, poiché PostgreSQL è un database MVCC e non elimina immediatamente tutti i dati, dovresti ripulire le cose con un VACUUM FULL o un CLUSTER .