PostgreSQL 9.3データ型の要素を更新する方法を理解できません。
私の例:
CREATE TABLE "user"
(
id uuid NOT NULL,
password character varying(255),
profiles json,
gender integer NOT NULL DEFAULT 0,
created timestamp with time zone,
connected timestamp with time zone,
modified timestamp with time zone,
active integer NOT NULL DEFAULT 1,
settings json,
seo character varying(255) NOT NULL,
CONSTRAINT id_1 PRIMARY KEY (id)
)
WITH (
OIDS=TRUE
);
ALTER TABLE "user"
OWNER TO postgres;
「プロファイル」のjson部分
{
"Facebook": {
"identifier": "xxxxxxxxxxx",
"profileURL": "none",
"webSiteURL": "none",
"photoURL": "none",
"displayName": "test2 test2",
"description": "none",
"firstName": "test2",
"lastName": "test2",
"gender": 2,
"language": "none",
"age": "none",
"birthDay": "none",
"birthMonth": "none",
"birthYear": "none",
"email": "[email protected]",
"emailVerified": "none",
"Added": null,
"phone": "none",
"address": "none",
"country": "none",
"region": "none",
"city": "none",
"Zip": "none"
},
"Google": {
"identifier": "xxxxxxxxxxxxxxxxxxxxxx",
"profileURL": "none",
"webSiteURL": "none",
"photoURL": "none",
"displayName": "test2 test2",
"description": "none",
"firstName": "test2",
"lastName": "test2",
"gender": 2,
"language": "none",
"age": "none",
"birthDay": "none",
"birthMonth": "none",
"birthYear": "none",
"email": "[email protected]",
"emailVerified": "none",
"Added": null,
"phone": "none",
"address": "none",
"country": "none",
"region": "none",
"city": "none",
"Zip": "none"
}
}
私はフロントエンドにx-editを使用していますが、このようなものが機能することを期待していましたが、機能しません。
UPDATE public.user
SET "profiles"->'Facebook'->'social'->'facebook' = 'test' WHERE` id='id'
Jsonデータ型を更新する方法に関する情報が見つからないようです。
これは単なる文字列なので、_regex_replace
_関数を使用してノードの簡単な変更/削除を実行できる場合があります。
たとえば、これは私が最近テーブル(すべての行)の特定のJSONノードを削除した方法です。
_UPDATE my_db.my_table
SET my_column = (regexp_replace(my_column::text, ',"some_json_node":(.*),', ','))::json
WHERE NOT my_column IS NULL
_
注:all私のJSONデータの場合、オブジェクトに"version":"(n).(n)"
(スキーマバージョン)ノードを保持します。これにより、特定のバージョンに準拠するオブジェクトを更新できます。要件はそれほど複雑ではないかもしれませんが、複雑な場合は、確かに役立ちます。
Postgres 9.3の完全なフィールドを更新する必要があると思います。少なくとも、これはドキュメントが私に言っていることです。
JSONドキュメントの個々の要素の更新は、私が間違っていなければ9.4になるでしょう。
これを試して
UPDATE Tablename
SET columnname = replace(columnname::TEXT,'"name":','"my-other-name"')::jsonb
WHERE id = 1;