"value "。手动拼接字符串易出错,建议使用hstore()函数构造。JSON数据需通过hstore(json_each_text())显式转换。更新字段时应用||运算符合并,避免直接赋值覆盖原有数据。hstore键名区分大小写且不支持嵌套结构。" />
当前位置: 首页
数据库
PostgreSQL中HSTORE类型数据的插入与键值对输入方法

PostgreSQL中HSTORE类型数据的插入与键值对输入方法

热心网友 时间:2026-05-08
转载

Eloquent中PostgreSQL Hstore需手动转JSON解析:将"key"=>"value"字符串替换=>为:并包裹{},再用json_decode转换为对象或数组

如何在PostgreSQL中插入HSTORE类型数据_使用键值对格式输入

免费影视、动漫、音乐、游戏、小说资源长期稳定更新! 👉 点此立即查看 👈

直接用字符串字面量插入 hstore,格式必须严格

PostgreSQL 的 hstore 类型不接受任意 JSON 或 Python 字典语法,只认一种固定字符串格式:"key1"=>"value1", "key2"=>"value2"。双引号不能省,=> 是唯一合法的键值分隔符,逗号后可有空格但不能换行或用中文标点。

常见错误包括:

  • 写成 {"a": "b"}(被当作文本,不是 hstore)
  • 漏掉外层双引号:a=>"b"(报错:syntax error at or near "a"
  • 键含空格但没引号:first name=>"John"(必须写成 "first name"=>"John"

正确示例:

INSERT INTO products (props) VALUES ('"color"=>"red", "size"=>"M", "in_stock"=>"true"');

用 hstore() 函数构造更安全,尤其含变量时

拼接字符串易出错,尤其键或值来自用户输入(含双引号、反斜杠等)。此时优先用内置函数 hstore(text[], text[]),它接受两个同长数组,自动转义:

INSERT INTO products (props) VALUES (hstore(ARRAY['price', 'unit'], ARRAY['29.99', 'kg']));

也支持单键值对简写:hstore('key', 'value')。注意:两个参数都必须是 text 类型,数值需显式转换,例如 hstore('count', 42::text)

对比风险点:

  • 手动拼串:'"count"=>"' || 42 || '"' — 若 42 是 null,结果变成 "count"=>"NULL"(字符串),而非缺失键
  • hstore():传入 NULL 值时该键直接被忽略,行为更符合预期

从 JSON 导入 hstore 需显式转换,别指望自动识别

即使表字段是 hstore,PostgreSQL 也不会把 JSON 字符串自动转成 hstore。以下写法无效:

INSERT INTO products (props) VALUES ('{"a":"b", "c":"d"}'); -- 插入的是 text,不是 hstore

必须用 hstore_to_json() 的逆操作 —— 实际要用 hstore(text, text)hstore(json_each_text())

INSERT INTO products (props) VALUES (hstore((SELECT hstore(array_agg(key), array_agg(value)) FROM json_each_text('{"a":"b","c":"d"}'::json))));

更实用的写法(PostgreSQL 12+):

INSERT INTO products (props) VALUES ((SELECT hstore(json_each_text('{"a":"b","c":"d"}'))));

注意:JSON 键名若含非 ASCII 字符或特殊符号,hstore 仍能存,但后续用 -> 操作符取值时需加双引号,例如 props->'"user-id"'

更新 hstore 字段时别直接赋值,用 || 合并更可控

hstore 支持 || 运算符合并,新键覆盖旧键,其余保留。直接 UPDATE ... SET props = 'new' 会清空所有原有键值对。

典型场景:仅更新部分字段,保留其他:

UPDATE products SET props = props || hstore('updated_at', now()::text) WHERE id = 123;

删除某个键?没有原生 delete 函数,得用 delete(hstore, text)

UPDATE products SET props = delete(props, 'temp_flag') WHERE id = 123;

容易忽略的细节:

  • || 左右操作数都必须是 hstore 类型,混用字符串会报错
  • 如果原字段为 NULLNULL || hstore(...) 结果仍是 NULL,需先用 COALESCE(props, ''::hstore)

hstore 的键名区分大小写,且不支持嵌套结构 —— 这些限制在设计初期就得明确,别等到导出数据时才发现所有 "ID""id" 被当成不同键。

来源:https://www.php.cn/faq/2414940.html

游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。

同类文章
更多
Redis延迟双删策略实现方法与实战示例

Redis延迟双删策略实现方法与实战示例

在缓存与数据库协同工作的经典模式中,Cache-Aside(旁路缓存)策略因其简洁高效而被广泛采用。然而,在高并发场景下,一个棘手的问题常常浮出水面:并发读写可能导致缓存被回填旧值,从而引发数据不一致。为了解决这个痛点,延迟双删(Delayed Double Deletion)方案应运而生,它是对C

时间:2026-05-08 08:45
MySQL复杂查询CPU飙升原因解析语法检查与计算节点开销详解

MySQL复杂查询CPU飙升原因解析语法检查与计算节点开销详解

MySQL复杂查询CPU飙升:解析器与优化器的“隐形战场” 说起MySQL复杂查询导致CPU飙升,很多人的第一反应是“数据量太大”或者“磁盘IO跟不上”。其实,真正的瓶颈往往不在数据读取本身,而在于查询“起飞”前的准备工作。当一条SQL包含嵌套子查询、多层JOIN,或者使用了非确定性函数时,解析器和

时间:2026-05-08 08:13
MySQL设置自增初始值教程 修改auto_increment实现多主复制

MySQL设置自增初始值教程 修改auto_increment实现多主复制

在MySQL双主架构中,为避免自增ID冲突,必须配对设置auto_increment_increment与auto_increment_offset参数。例如将步长设为2,两主库偏移量分别设为1和2,可生成错开的奇偶ID序列。配置需写入my cnf文件并重启服务以永久生效,同时确保server-id唯一并开启log_slave_updates,从而构建稳定的

时间:2026-05-08 08:13
MySQL 5.7 与 8.0 版本 JSON 功能及索引支持对比详解

MySQL 5.7 与 8.0 版本 JSON 功能及索引支持对比详解

MySQL5 7支持JSON类型与基础函数,但需通过生成列实现索引,且不支持部分更新。MySQL8 0则引入了真正的JSON部分更新和函数索引,无需生成列中转,并新增了聚合函数等增强功能。升级至8 0需手动创建函数索引、重写查询并测试字符集兼容性。

时间:2026-05-08 08:13
JSON扩展字段SQL注入防御方法解析与参数绑定实践

JSON扩展字段SQL注入防御方法解析与参数绑定实践

JSON字段解析后直接拼接SQL字符串存在严重注入风险。必须将所有JSON解析结果视为不可信输入,并严格使用参数化绑定(如MyBatis的` {}`)。动态字段名需通过白名单硬校验,JSON路径表达式同样需参数化或白名单控制。参数化需贯穿每个从JSON提取的值,杜绝信任假设。

时间:2026-05-08 08:12
热门专题
更多
刀塔传奇破解版无限钻石下载大全 刀塔传奇破解版无限钻石下载大全
洛克王国正式正版手游下载安装大全 洛克王国正式正版手游下载安装大全
思美人手游下载专区 思美人手游下载专区
好玩的阿拉德之怒游戏下载合集 好玩的阿拉德之怒游戏下载合集
不思议迷宫手游下载合集 不思议迷宫手游下载合集
百宝袋汉化组游戏最新合集 百宝袋汉化组游戏最新合集
jsk游戏合集30款游戏大全 jsk游戏合集30款游戏大全
宾果消消消原版下载大全 宾果消消消原版下载大全
  • 日榜
  • 周榜
  • 月榜
热门教程
更多
  • 游戏攻略
  • 安卓教程
  • 苹果教程
  • 电脑教程