如何更新具有多个值的SQL列

时间:2014-05-28 10:47:09

标签: sql json

我的数据库中有一个包含多个值的列,以下是这些值的示例:

SQL列名为extra_fields,类型为text

[{"id":"2","value":"Ser mayor de edad"},
{"id":"3","value":"Prueba de extension"},
{"id":"4","value":"99.999.99"},
{"id":"5","value":"10"}}

我在PHP函数中有这个,我得到了我想要修改的值:

$db = $this->getDbo();
    $query = 'SELECT * FROM #__k2_items where id='.$item_id;
    $db->setQuery($query);

    $resultado = $db->loadObject();

$campos_extra = json_decode($resultado->extra_fields); 

    $num_max_cup_descargar = $campos_extra[2]->value;
    $num_max_cup_canjear = $campos_extra[3]->value;
    $num_max_cup_x_dia = $campos_extra[4]->value;
    $num_max_cup_uti_canje_x_user_dia = $campos_extra[5]->value;
    $num_max_cup_desc_user = $campos_extra[6]->value;

我正在尝试更新其中一个值,我该怎么做?

编辑:我正在使用MySQL数据库。

2 个答案:

答案 0 :(得分:1)

您将无法仅使用SQL更新文本列中某些值的子字符串。 MySQL并不关心你是否有一个字符串化的JSON对象或莎士比亚戏剧的一部分。您必须通过在PHP中执行此更新此值:

  

$ campos_extra = json_decode($ resultado-> extra_fields);

$num_max_cup_descargar = $campos_extra[2]->value;
$num_max_cup_canjear = $campos_extra[3]->value;
$num_max_cup_x_dia = $campos_extra[4]->value;
$num_max_cup_uti_canje_x_user_dia = $campos_extra[5]->value;
$num_max_cup_desc_user = $campos_extra[6]->value;

$num_max_cup_desc_user = "changedUser";
$campos_extra[6]->value = $num_max_cup_desc_user;
     

$ campos_extra_updated = json_encode($ campos_extra);

将$ campos_extra_updated放入数据库的该字段中。

答案 1 :(得分:1)

为了动态支持此类查询,您可以使用两种不同的方法:

  1. 以编程方式操作数据

    嗯,这很简单 - 很好地总结它意味着你必须编写逻辑来端到端地操作数据。这样做的一大好处是,您的解决方案不依赖于底层数据库引擎。

  2. 使用特定于数据库的扩展程序

    大多数当前的RDBMS引擎都支持存储在表中的动态列或数组数据。在MySQL的情况下,有一个名为MariaDB的开源克隆支持这种机制 - 请参阅Dynamic Columns in MariaDB的文档。

    使用PostgreSQL,您可以选择存储JSON and manipulate that directly (limited)array columncomposite types(如果您的属性定义良好)或hstore来创建无模式设计。

    以上所有实现都有其优点和缺点,所以你必须明智地选择。但是所有这些都带来了对列的索引(以及因此查询),一些常规SQL支持等的附加好处。明智地选择: - )