Tại sao không chỉ sử dụng lo_from_bytea
?
Ví dụ:
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)
Vì vậy, để thực sự di chuyển (tốt hơn là bạn nên có một bản sao lưu) dữ liệu từ văn bản sang OID, bạn có thể làm như sau:
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;
... và cuối cùng, vì PostgreSQL là cơ sở dữ liệu MVCC và không xóa tất cả dữ liệu ngay lập tức, bạn nên dọn dẹp mọi thứ bằng VACUUM FULL
hoặc CLUSTER
.