【问题标题】:How to INSERT JSON objects in an array in MySQL?如何在 MySQL 的数组中插入 JSON 对象?
【发布时间】:2020-12-11 16:19:01
【问题描述】:

我目前被分配了一项任务,将我们的活动非规范化表转换为规范化表。我们决定使用数据库触发器来促进批量迁移和后续数据更改,直到我们停止使用旧表。

下面是我们旧表的结构和示例:

SELECT * FROM TabHmIds;

ID  EntitlementID   TabId   HmId
1   101             201     301
2   102             202     302

我们的新表所需的结构和示例应如下所示:

SELECT * FROM tab_integration;
id  tab_id  integration_id  metadata
1   201     1               { "paid_id": {"entitlement_id": 101, "id": 301} }
2   202     1               { "paid_id": {"entitlement_id": 202, "id": 302} }

以下是我迄今为止在 INSERT 触发器中所做的:

CREATE TRIGGER tab_integration_after_insert AFTER INSERT ON `TabHmIds` 
FOR EACH ROW 
BEGIN 

DECLARE var_metadata JSON;
DECLARE var_new_metadata JSON;
DECLARE var_hm_metadata JSON;
DECLARE var_integration_id INT(11);

SELECT
  metadata,
  integration_id INTO var_metadata,
  var_integration_id
FROM
  `go`.`tab_integration` gti
WHERE
  gti.`tab_id` = NEW.`TabId`;

SET var_hm_metadata = JSON_OBJECT('entitlement_id', NEW.`EntitlementId`, 'id', NEW.`HmId`);

IF var_integration_id = 1 THEN 
    
    IF var_metadata IS NULL THEN
        SET var_new_metadata = JSON_OBJECT('paid_id', var_hm_metadata);
        
    ELSE
        SET @paid_id = JSON_UNQUOTE(JSON_EXTRACT(var_metadata, '$.paid_id'));        
        SET var_new_metadata = JSON_ARRAY_APPEND(var_metadata, '$.paid_id', var_hm_metadata);

    END IF;
    
END IF;

UPDATE `tab_integration` gti SET `metadata` = var_new_metadata WHERE `tab_id` = NEW.`TabId`;

END

但是,我得到的是:

SELECT * FROM tab_integration;

id  tab_id  integration_id  metadata
1   201     1               { "paid_id": "{\"entitlement_id\": 101, \"id\": 301}" }
2   202     1               { "paid_id": "{\"entitlement_id\": 202, \"id\": 302}" }

从上表可以看出,JSON 对象被解析为 STRING。我知道 JSON_OBJECT 将传递的值解析为字符串。所以我使用 JSON_UNQUOTE(JSON_EXTRACT(...)) 将paid_id 路径值转换为 JSON,但它没有被解析为 JSON。我还尝试 JSON_MERGE_PRESERVE 将 JSON 对象放在paid_id 路径下,但我最终得到:

{“paid_id”: [], “entitlement_id”: 101, “id”: 301 }

我还尝试使用 JSON_TABLE 将 JSON 数组放入临时表中,并修改临时表中的值并使用 JSONARRAYAGG 将该临时表转换为 JSON。但是 Workbench 一直说我的语法有错误,即使我直接从网上复制了示例。

我还尝试将格式正确的字符串转换为 JSON,但 Workbench 也会引发语法错误。 我花了一周的时间在 MySQL 中解析这个数据结构。

数据库脚本不是我的强项,我是 MySQL 中 JSON 函数的新手。提前感谢那些会回复的人。

如果需要,我的 MySQL Workbench 版本是 10.4.13-MariaDB。但该脚本应该可以在 MySQL 5.7 中运行。

【问题讨论】:

  • 不要使用数组。我发现它们有意义的案例很少。大多数时候,它们只是使事情复杂化。
  • 嗨@TheImpaler。那么我应该只建议重组规范化表吗?这是否意味着我的问题根本不可行?提前致谢。

标签: mysql json triggers normalization transformation


【解决方案1】:

我找到了问题的答案。

在插入新的 JSON 数据之前,我将其解析为 CHAR 并替换了字符,使其成为字符串。我做了以下,它的工作!

# After performing the needed JSON manipulations, cleanse the JSON string to JSON.

SET var_new_metadata = CAST(var_new_metadata AS CHAR);

SELECT REPLACE(REPLACE(REPLACE(var_new_metadata, '\\', ''), '\"\{', '{'), '\}\"', '}') INTO var_new_metadata;

清理数据后,UPDATE 调用仍然有效,之后尝试进行一些 JSON 操作,是的,仍然有效!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-07
    • 1970-01-01
    • 2020-09-02
    • 2019-03-17
    • 2020-11-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多