1

我有一个像下面这样的 php 数组。

$arr = array(
                array(
                    "date"=>date('Y-m-d'),
                    "message"=>"test message 1",
                    "from_id"=>21,
                    "to_id"=>14
                ),
                array(
                    "date"=>date('Y-m-d'),
                    "message"=>"test message 2",
                    "from_id"=>23,
                    "to_id"=>12
                )               
            );

我在这个数组上做了一个 json_encode 来将它转换成 json。

$jsonarr =  json_encode($arr);

$jsonarr 的输出:

[
 {"date":"2012-11-22","message":"test message 1","from_id":21,"to_id":14},
 {"date":"2012-11-22","message":"test message 2","from_id":23,"to_id":12}
]

之后,我将其插入 mysql 表中。到这里为止一切都很好。

现在我必须通过连接用另一个 json 更新它。

另一个 JSON:

[
 {"date":"2012-11-22","message":"test message 3","from_id":28,"to_id":2},
 {"date":"2012-11-22","message":"test message 4","from_id":53,"to_id":72}
]

我希望我的 mysql 表中的字段显示如下:

[
 {"date":"2012-11-22","message":"test message 1","from_id":21,"to_id":14},
 {"date":"2012-11-22","message":"test message 2","from_id":23,"to_id":12},
 {"date":"2012-11-22","message":"test message 3","from_id":28,"to_id":2},
 {"date":"2012-11-22","message":"test message 4","from_id":53,"to_id":72}
]

我如何为此编写一个 UPDATE 查询。

我可以通过使用 2 个查询来做到这一点。一个选择查询,然后格式化该字段并稍后更新。但这可以通过一个查询来实现吗?

4

1 回答 1

1

您当前问题的解决方案是:

MySQL 本身不支持 JSON 值。您需要从数据库中获取值:

SELECT FOR UPDATE my_json_field
FROM my_table
WHERE id = 555;

然后在PHP脚本中修改:

$my_array = json_decode($value_of_my_json_field);
$my_array = array_merge($my_array, $arr);
$value_of_my_json_field = json_encode($my_array);

然后在数据库中更新它:

UPDATE my_table
SET my_json_field = :value_of_my_json_field
WHERE id = 555;

确保这发生在事务中。此外,您需要使用 InnoDB 存储引擎。

但更有趣的问题是为什么需要将 JSON 存储在 DB 中?为什么不使用单独的表:

  • 表:消息
    • id 整数
    • 日期时间戳
    • from_id 整数(这应该是外键)
    • to_id 整数(这应该是外键)

然后你可以简单地插入到那个表中。这是这样做的正确方法。如果您没有很好的理由使用 JSON,我建议您摆脱它。

于 2012-11-22T06:36:29.847 回答