PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Migrer la colonne text/bytea PostgreSQL vers un objet volumineux ?

Pourquoi ne pas simplement utiliser lo_from_bytea ?

Exemple :

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)

Ainsi, pour réellement déplacer (vous feriez mieux d'avoir une sauvegarde) les données du texte vers les OID, vous pouvez procéder comme suit :

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;

...et enfin, comme PostgreSQL est une base de données MVCC et ne supprime pas immédiatement toutes les données, vous devez nettoyer les choses avec soit un VACUUM FULL ou un CLUSTER .