如何在 Postgres table 中插入一个具有一个键的 hstore 值和一个值数组作为对应值?
How to insert in a Postgres table, a hstore value having one key and an array of values of as corresponding value?
所以我必须在Postgres中创建一个table来存储图像上显示的table的内容(events_logs)。我发现我应该为 PARAMS 列使用 hstore
类型并且一切都很好,除了第三行,其中键链接到一个数组而不是像其他的那样的字符串。
这是我使用的脚本,第三行数据插入出现语法错误:
CREATE TABLE events_logs(
EVENT_DATE timestamp without time zone NOT NULL,
USER_ID VARCHAR(25) NOT NULL,
EVENT_ID integer NOT NULL,
EVENT_VALUE NUMERIC,
PARAMS hstore,
PRIMARY KEY (EVENT_DATE,USER_ID,EVENT_ID),
CONSTRAINT events_logs_event_id_fkey FOREIGN KEY (EVENT_ID)
REFERENCES events (EVENT_ID) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION
);
INSERT INTO events_logs (EVENT_DATE,USER_ID,EVENT_ID,EVENT_VALUE,PARAMS) VALUES
('2017-09-13 12:01:00','aed-355-dg25',3,NULL,''),
('2017-09-13 12:05:00','aed-355-dg25',2,NULL,'term => [“lamp”, “blue”]'),
('2017-09-13 12:06:00','ryf-734-em0',3,NULL,''),
('2017-09-13 12:08:00','ryf-734-em0',2,NULL,'term => “rug”');
我也尝试了 term => {“lamp”, “blue”}
和 term => ARRAY[“lamp”, “blue”]
以及我从各个论坛获得的变体,但其中 none 给了我预期的结果。
所以我的问题是:
是否可以将元素数组关联到 hstore 值中的单个键?
有没有比hstore更适合这个需求的类型?
Is there a type that is a better fit for this requirement other than hstore?
是:jsonb
- 它的额外好处是它是内置类型,不需要使用 CREATE EXTENSION。
在这种情况下,您的 INSERT 应该如下所示:
INSERT INTO events_logs
(EVENT_DATE,USER_ID,EVENT_ID,EVENT_VALUE,PARAMS)
VALUES
('2017-09-13 12:01:00','aed-355-dg25',3,NULL,''),
('2017-09-13 12:05:00','aed-355-dg25',2,NULL,'{"term": ["lamp", "blue"]}'),
('2017-09-13 12:06:00','ryf-734-em0',3,NULL,''),
('2017-09-13 12:08:00','ryf-734-em0',2,NULL,'{"term": "rug"}');
或者简单地存储没有 term
关键字的参数和一个简单的数组:例如'["lamp", "blue"]'
或 '["rug"]'
。我总是将列表参数存储为一个数组,即使它只是一个值。它使访问元素更容易,因为您不需要区分单个值和多个值。
如果这总是只是一个键列表,你也可以考虑一个原生数组:text[]
所以我必须在Postgres中创建一个table来存储图像上显示的table的内容(events_logs)。我发现我应该为 PARAMS 列使用 hstore
类型并且一切都很好,除了第三行,其中键链接到一个数组而不是像其他的那样的字符串。
这是我使用的脚本,第三行数据插入出现语法错误:
CREATE TABLE events_logs(
EVENT_DATE timestamp without time zone NOT NULL,
USER_ID VARCHAR(25) NOT NULL,
EVENT_ID integer NOT NULL,
EVENT_VALUE NUMERIC,
PARAMS hstore,
PRIMARY KEY (EVENT_DATE,USER_ID,EVENT_ID),
CONSTRAINT events_logs_event_id_fkey FOREIGN KEY (EVENT_ID)
REFERENCES events (EVENT_ID) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION
);
INSERT INTO events_logs (EVENT_DATE,USER_ID,EVENT_ID,EVENT_VALUE,PARAMS) VALUES
('2017-09-13 12:01:00','aed-355-dg25',3,NULL,''),
('2017-09-13 12:05:00','aed-355-dg25',2,NULL,'term => [“lamp”, “blue”]'),
('2017-09-13 12:06:00','ryf-734-em0',3,NULL,''),
('2017-09-13 12:08:00','ryf-734-em0',2,NULL,'term => “rug”');
我也尝试了 term => {“lamp”, “blue”}
和 term => ARRAY[“lamp”, “blue”]
以及我从各个论坛获得的变体,但其中 none 给了我预期的结果。
所以我的问题是:
是否可以将元素数组关联到 hstore 值中的单个键?
有没有比hstore更适合这个需求的类型?
Is there a type that is a better fit for this requirement other than hstore?
是:jsonb
- 它的额外好处是它是内置类型,不需要使用 CREATE EXTENSION。
在这种情况下,您的 INSERT 应该如下所示:
INSERT INTO events_logs
(EVENT_DATE,USER_ID,EVENT_ID,EVENT_VALUE,PARAMS)
VALUES
('2017-09-13 12:01:00','aed-355-dg25',3,NULL,''),
('2017-09-13 12:05:00','aed-355-dg25',2,NULL,'{"term": ["lamp", "blue"]}'),
('2017-09-13 12:06:00','ryf-734-em0',3,NULL,''),
('2017-09-13 12:08:00','ryf-734-em0',2,NULL,'{"term": "rug"}');
或者简单地存储没有 term
关键字的参数和一个简单的数组:例如'["lamp", "blue"]'
或 '["rug"]'
。我总是将列表参数存储为一个数组,即使它只是一个值。它使访问元素更容易,因为您不需要区分单个值和多个值。
如果这总是只是一个键列表,你也可以考虑一个原生数组:text[]