我在一个大对象中有数据,现在我想复制它,这样我就可以在保留原始副本的同时附加到它。 是否有任何 JDBC 调用或 SQL 语句可以用来导致这种情况发生?
从我找到的每一个资源中,似乎我必须将所有数据实际读取到我的客户端并再次写出才能获取副本。 我更愿意节省往返路程。
如果您知道大型对象,则可以通过两个查询来复制/克隆它oid
。
INSERT INTO pg_largeobject_metadata (lomowner, lomacl)
SELECT lomowner, lomacl
FROM pg_largeobject_metadata
WHERE oid = <my_old_oid>
RETURNING oid AS my_new_oid;
INSERT INTO pg_largeobject (loid, pageno, data)
SELECT <my_new_oid>, pageno, data
FROM pg_largeobject
WHERE loid = <my_old_oid>;
my_old_oid
是大物体的已知 oid
my_new_oid
是第一个insert语句返回的oid
服务器端 lo_import 和 lo_export 函数。您必须将数据从数据库移动到文件系统,然后再移回,但至少这是服务器的文件系统,而不是客户端的。
lo_from_bytea 和 lo_get:
SELECT lo_from_bytea(0, lo_get(<the large object you want to clone>));
这会将创建的大对象的所有者设置为当前用户,因此您可能必须随后更改大对象的所有者:
ALTER LARGE OBJECT <returned oid of the newly created lo> OWNER TO <username>;
参考:
https://www.postgresql.org/docs/14/lo-funcs.html
https://www.postgresql.org/docs/14/sql-alterlargeobject.html