PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Hinzufügen eines Schlüssels zu einer leeren hstore-Spalte

Ich denke, das Problem hier ist, dass der hstore, den Sie haben, null ist, und null ODER ein hstore ist null.

Die beste Lösung, die ich habe, die wahrscheinlich nicht die beste Lösung ist, besteht darin, die Tabelle mit einem standardmäßig leeren hstore zu erstellen, anstatt null zuzulassen. Dann funktionieren Ihre Beispiele wie gewünscht:

postgres=# create table htest (t text, h hstore default hstore(array[]::varchar[]));
CREATE TABLE
postgres=# insert into htest (t) values ('key');
INSERT 0 1
postgres=# update htest set h = h || ('foo'=>'bar') where t='key';
UPDATE 1
postgres=# select * from htest;
  t  |      h       
-----+--------------
 key | "foo"=>"bar"
(1 row)

Ich sehe leider keinen saubereren Weg, um einen leeren hstore zu erstellen als hstore(array[]::varchar[]) aber das bedeutet nicht, dass es keinen besseren Weg gibt. Sie könnten dies wie folgt in Ihr hstore-Update einbauen:

update htest set h = coalesce(h, hstore(array[]::varchar[])) || ('foo'=>'bar') where t='key';

Auf diese Weise müssen Sie die Tabelle nicht neu erstellen. Das finde ich aber ziemlich krass. Hoffe das hilft.