1
insert into hospital_image 
select 'HospitalImage', 
       lo_from_bytea(1,decode('/9j/4AAQSkZJRgABAQEA3ADcAAD','base64')),
       'jpg',
       '123'
where not exists (select null from pg_largeObject where loid=1);

CREATE TABLE hospital_image ( 
   key character varying(30) NOT NULL, 
   image oid NOT NULL,
   mime_type character varying(30) NOT NULL, 
   version numeric(8,0) NOT NULL,
   CONSTRAINT 
      pk_hospital_image PRIMARY KEY (key)
) WITH ( OIDS=FALSE );

 ALTER TABLE
    hospital_image OWNER TO postgres;

在上面的语句中,我们将loid手动提供为 1。相反,我们希望loid动态使用lo_create(0). 当我lo_create(0)按照Postgres docs使用时,我得到一个异常。

我同时使用了lo_creat(-1)lo_create(0)。两者都不起作用。就是说loid已经存在了。如何在我的查询中使用上述功能。


包含变量 OID 的我的 SQL 语句是:

INSERT INTO hospital_image (key, image, mime_type, version)
VALUES ('MainLogoImage99999',
        lo_from_bytea(lo_create(0),
                      decode('/9j4AAQSkZJRgABAQEA3ADcAAD',
                      'base64'))‌​,
        'jpg',
        123);

错误信息是:

ERROR: duplicate key value violates unique constraint "pg_largeobject_metadata_oid_index"
SQL state: 23505
Detail: Key (oid)=(34773) already exists. 
4

1 回答 1

3

两者lo_creat(-1)(参数无关紧要)lo_create(0)都将创建一个新的大对象并返回其 OID。

lo_create(-1)lo_create(4294967295)– OID 是无符号的 4 字节整数相同。

lo_from_bytea 还会创建一个新的大对象,因此如果您将结果从 传递给它lo_create,它会抱怨它无法再次创建具有相同编号的大对象。

只需将0而不是lo_create(0)作为第一个参数传递给lo_from_bytea.

于 2018-01-25T10:01:12.507 回答