我有这样的情况,简化:
CREATE TABLE `user_points` (
`date` date NOT NULL,
`user_id` mediumint(8) unsigned NOT NULL,
`points` int(11) NOT NULL,
PRIMARY KEY (`date`, `user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
所以,如果今天用户获得积分,我会:
INSERT INTO user_points (date, user_id, points) VALUES (CURDATE(),?,1)
ON DUPLICATE KEY UPDATE points=points+1;
现在,想象一下我想将这些点存储到一个JSON字段中,它不仅包含点,而且可能包含其他属性(这些属性是动态的,有些客户端永远不会使用任何属性,其他客户端会使用很多属性,这就是我喜欢的原因) JSON)
因此,我想在points
列上设置$.points
,而不是添加到data
。
是否可以进行单个查询来执行此操作?
{"points": 1}
的新行SET data="{"points": 1}"
JSON_SET(data, '$.points', 1)
我试过了:
SELECT JSON_SET('{"a": 1, "l": 2}', '$.points',
JSON_EXTRACT('{"a": 1, "l": 2}', '$.points')+1) AS 'Data';
但它不起作用(因为NULL + 1 = NULL而不是1)
编辑:可以用COALESCE解决,但我不确定它是最好的解决方案:
SELECT JSON_SET('{"a": 1, "l": 2}', '$.points',
COALESCE(JSON_EXTRACT('{"a": 1, "l": 2}', '$.points'), 0)+1) AS 'Data';
完整的查询将是:
INSERT INTO user_points (date, user_id, data) VALUES (CURDATE(),?,'{"points":1}')
ON DUPLICATE KEY UPDATE data=JSON_SET(data, '$.points',
COALESCE(JSON_EXTRACT(data, '$.points'), 0)+1);