【发布时间】: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