我有一个带有JSON列的MySQL表。我想更新JSON列中的一些行,将JSON值从浮点值更改为整数。例如CCD_ 1应当变成CCD_。看起来MySQL发现这两个值是等价的,所以它从不麻烦更新行。
以下是我的test
表的状态:
mysql> describe test;
+-------+------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------+------+-----+---------+-------+
| id | int | NO | PRI | NULL | |
| val | json | YES | | NULL | |
+-------+------+------+-----+---------+-------+
2 rows in set (0.00 sec)
mysql> select * from test;
+----+-------------+
| id | val |
+----+-------------+
| 1 | {"a": 20.0} |
+----+-------------+
1 row in set (0.00 sec)
我的目标是将val
更改为{"a": 20}
我尝试了以下查询:
mysql> update test set val=JSON_OBJECT("a", 20) where id=1;
Query OK, 0 rows affected (0.00 sec)
Rows matched: 1 Changed: 0 Warnings: 0
(0行已更改(
mysql> update test
set val=JSON_SET(
val,
"$.a",
FLOOR(
JSON_EXTRACT(val, "$.a")
)
)
where id=1;
Query OK, 0 rows affected (0.00 sec)
Rows matched: 1 Changed: 0 Warnings: 0
(0行已更改(
mysql> insert into test (id, val) values (1, JSON_OBJECT("a", 20)) ON DUPLICATE KEY UPDATE id=VALUES(id), val=VALUES(val);
Query OK, 0 rows affected, 2 warnings (0.00 sec)
(0行受影响(
无论我是尝试修改现有值,还是指定一个全新的JSON_OBJECT,我都不在乎如何编写它。所以我想知道原因是否只是MySQL考虑了之前的&之后的值相等。
有办法解决这个问题吗?
(这不是解决原始问题,而是解决在回答问题时遇到的问题。(
恶心。。。8.0有一段顽皮的历史,在最近对某个东西进行了抨击后,很快就删除了它。小心。以下是8.0.20的变更日志中VALUES
的问题:
-----2020-04-27 8.0.20全面上市-------
正在使用VALUES((访问INSERT中的新行值。。。ON DUPLICATE KEY UPDATE语句现在已被弃用,并将在未来的MySQL版本中删除。相反,您应该使用MySQL 8.0.19及更高版本中实现的新行及其列的别名。
例如,这里显示的语句使用VALUES((访问新行值:
INSERT INTO t1 (a,b,c) VALUES (1,2,3),(4,5,6)
ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);
此后,您应该使用类似于以下的语句,该语句为新行使用别名:
INSERT INTO t1 (a,b,c) VALUES (1,2,3),(4,5,6) AS new
ON DUPLICATE KEY UPDATE c = new.a+new.b;
或者,您可以为新行及其每一列使用别名,如下所示:
INSERT INTO t1 (a,b,c) VALUES (1,2,3),(4,5,6) AS new(m,n,p)
ON DUPLICATE KEY UPDATE c = m+n;
有关更多信息和示例,请参阅INSERT。。。ON DUPLICATE KEY UPDATE语句。