MySQL 中 JSON 对象的部分更新
Partial update of JSON Object in MySQL
下午好,
当我尝试使用 ON DUPLICATE KEY UPDATE
更新 JSON 对象的一部分时,如何使用键更新特定值?
代码执行成功,但当我只希望股票在更新时发生变化时,所有值都会更新。
欢迎任何帮助,我不服气,我理解MySQL JSON 路径语法,或者JSON_SET 无法实现我的目标?
INSERT INTO table (name, attributes) VALUES
("Sarah", JSON_OBJECT('profile', "F", "el", "[4, 5, 6]")),
("John", JSON_OBJECT('profile', "M", "el", "[10]"))
AS t
ON DUPLICATE KEY UPDATE
attributes = JSON_SET(t.attributes, '$.attributes.el', '$.attributes.el')
# ^
# +--- value being inserted
我也试过另一种口味没成功:
attributes = JSON_REPLACE(t.attributes, '$.t.el', "$.t.el")
第三次尝试使用通配符和 json 提取,替换整个 JSON_OBJECT()
attributes = JSON_REPLACE(t.attributes, '$.t[2]', JSON_EXTRACT(t.attributes, "$.stock"))
如果我理解正确,您只需要在 INSERT ... ON DUPLICATE KEY UPDATE
语句中使用 VALUES
function 即可访问要插入的值:
CREATE TABLE t(
name varchar(100) NOT NULL UNIQUE,
attributes JSON
);
INSERT INTO t(name, attributes) VALUES
('Sarah', '{"profile": "F", "el": ["insrted", 1]}'),
('John', '{"profile": "M", "el": ["insrted", 2]}');
-- insert + on duplicate (mysql 5.x)
INSERT INTO t(name, attributes) VALUES
('Sarah', '{"profile": "F", "el": ["dup_upd", 3]}'),
('John', '{"profile": "M", "el": ["dup_upd", 4]}'),
('Jack', '{"profile": "M", "el": ["insrted", 1]}')
ON DUPLICATE KEY UPDATE attributes =
JSON_SET(attributes, '$.el', JSON_EXTRACT(VALUES(attributes), '$.el'));
-- insert + on duplicate (mysql 8.x)
INSERT INTO t(name, attributes) VALUES
('Sarah', '{"profile": "F", "el": ["dup_upd", 3]}'),
('John', '{"profile": "M", "el": ["dup_upd", 4]}'),
('Jack', '{"profile": "M", "el": ["insrted", 1]}')
AS t_ins
ON DUPLICATE KEY UPDATE attributes =
JSON_SET(t.attributes, '$.el', JSON_EXTRACT(t_ins.attributes, '$.el'));
SELECT name, JSON_PRETTY(attributes)
FROM t
name | JSON_PRETTY(attributes)
------|-------------------------------------------
Sarah | {"el": ["dup_upd", 3], "profile": "F"}
John | {"el": ["dup_upd", 4], "profile": "M"}
Jack | {"el": ["insrted", 1], "profile": "M"}
JSON_EXTRACT
可能会帮助您从插入的重复行中提取新值。
INSERT INTO table_name (name, attributes) VALUES
("Sarah", JSON_OBJECT('profile', "F", "el", "[4, 5, 6]" )),
("John", JSON_OBJECT('profile', "M", "el", "[10]" ))
AS t ON DUPLICATE KEY UPDATE
attributes = JSON_SET(table_name.attributes, '$.el', JSON_EXTRACT(t.attributes, '$.el'))
注意 仅在 MySQL 版本 8.x 中支持使用 AS
关键字为正在插入的行添加别名,在之前的版本中您可以使用 VALUES
关键字引用它。
下午好,
当我尝试使用 ON DUPLICATE KEY UPDATE
更新 JSON 对象的一部分时,如何使用键更新特定值?
代码执行成功,但当我只希望股票在更新时发生变化时,所有值都会更新。
欢迎任何帮助,我不服气,我理解MySQL JSON 路径语法,或者JSON_SET 无法实现我的目标?
INSERT INTO table (name, attributes) VALUES
("Sarah", JSON_OBJECT('profile', "F", "el", "[4, 5, 6]")),
("John", JSON_OBJECT('profile', "M", "el", "[10]"))
AS t
ON DUPLICATE KEY UPDATE
attributes = JSON_SET(t.attributes, '$.attributes.el', '$.attributes.el')
# ^
# +--- value being inserted
我也试过另一种口味没成功:
attributes = JSON_REPLACE(t.attributes, '$.t.el', "$.t.el")
第三次尝试使用通配符和 json 提取,替换整个 JSON_OBJECT()
attributes = JSON_REPLACE(t.attributes, '$.t[2]', JSON_EXTRACT(t.attributes, "$.stock"))
如果我理解正确,您只需要在 INSERT ... ON DUPLICATE KEY UPDATE
语句中使用 VALUES
function 即可访问要插入的值:
CREATE TABLE t(
name varchar(100) NOT NULL UNIQUE,
attributes JSON
);
INSERT INTO t(name, attributes) VALUES
('Sarah', '{"profile": "F", "el": ["insrted", 1]}'),
('John', '{"profile": "M", "el": ["insrted", 2]}');
-- insert + on duplicate (mysql 5.x)
INSERT INTO t(name, attributes) VALUES
('Sarah', '{"profile": "F", "el": ["dup_upd", 3]}'),
('John', '{"profile": "M", "el": ["dup_upd", 4]}'),
('Jack', '{"profile": "M", "el": ["insrted", 1]}')
ON DUPLICATE KEY UPDATE attributes =
JSON_SET(attributes, '$.el', JSON_EXTRACT(VALUES(attributes), '$.el'));
-- insert + on duplicate (mysql 8.x)
INSERT INTO t(name, attributes) VALUES
('Sarah', '{"profile": "F", "el": ["dup_upd", 3]}'),
('John', '{"profile": "M", "el": ["dup_upd", 4]}'),
('Jack', '{"profile": "M", "el": ["insrted", 1]}')
AS t_ins
ON DUPLICATE KEY UPDATE attributes =
JSON_SET(t.attributes, '$.el', JSON_EXTRACT(t_ins.attributes, '$.el'));
SELECT name, JSON_PRETTY(attributes)
FROM t
name | JSON_PRETTY(attributes)
------|-------------------------------------------
Sarah | {"el": ["dup_upd", 3], "profile": "F"}
John | {"el": ["dup_upd", 4], "profile": "M"}
Jack | {"el": ["insrted", 1], "profile": "M"}
JSON_EXTRACT
可能会帮助您从插入的重复行中提取新值。
INSERT INTO table_name (name, attributes) VALUES
("Sarah", JSON_OBJECT('profile', "F", "el", "[4, 5, 6]" )),
("John", JSON_OBJECT('profile', "M", "el", "[10]" ))
AS t ON DUPLICATE KEY UPDATE
attributes = JSON_SET(table_name.attributes, '$.el', JSON_EXTRACT(t.attributes, '$.el'))
注意 仅在 MySQL 版本 8.x 中支持使用 AS
关键字为正在插入的行添加别名,在之前的版本中您可以使用 VALUES
关键字引用它。