【问题标题】:Updating array data in stored procedure在存储过程中更新数组数据
【发布时间】:2012-11-15 14:10:57
【问题描述】:

所以这是我的问题。我知道这个网站上有很多关于这类问题的文献,但我对这些问题中的几个如何与我的问题交织在一起感到困惑。首先,我有一个行数据数组,需要根据该数组中的远程 id 值更新或插入,在本例中为value_c。该数组对应于表 foo 中的一个行实例。基本上,如果数据库中存在具有匹配value_c 的记录,则更新该记录,否则插入新的记录有效负载。数组的数据结构对应于我们db中表foo的行模式。这是架构(为安全起见进行了混淆):

CREATE TABLE IF NOT EXISTS `foos` (
     `id` int(11) NOT NULL AUTO_INCREMENT,
     `value_a` varchar(13) DEFAULT NULL,
     `value_b` int(11) DEFAULT NULL,
     `value_c` int(11) DEFAULT NULL,
     .
     .
     .
     .
     `value_x` enum('enum_a','enum_b','enum_c','enum_d') DEFAULT NULL,
     `value_y` text,
     `value_z` enum('daily','monthly','weekly') DEFAULT NULL,
     `value_aa` tinyint(4) NOT NULL,
     `value_bb` varchar(1000) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=829762 ;

有很多数据,计划如下。对这些数据进行字符串化处理,将其发送到存储过程,然后根据需要进行更新或插入。类似于以下内容(请注意,这将发生在 codeigniter 中的模型中):

public function update_or_insert($event_array_payload)
{
    // string-ify the data
    $mod_payload = implode('<delimiter>', $event_array_payload)

    //deal with NULLs in array
    $mod_payload = $this->deal_with_nulls($mod_payload);

    $this->stored_procedure_lib->update_or_insert_payload($mod_payload);
}

// then elsewhere in the stored procedure library
public function update_or_insert_payload($foo)
{
    $this->_CI->db->query('CALL update_or_insert_foo(\'$foo\')');
}

我的问题如下。单个字符串值被传递到存储过程中。然后需要将其解析并放入单个更新或单个插入语句中。我可以为foo 表的每一列创建一个变量,并创建一个循环来填充每个变量并以这种方式更新/插入,但是 foo 表很可能会被扩展,我不想在下面创建错误线。有没有办法将数组的字符串表示的解析分开的内容动态放置到单个更新或插入语句中。我不确定这是否可能,但我觉得可能存在我不知道的解决方法。谢谢你的帮助。

【问题讨论】:

  • 你的意思是你想要一个过程 update_or_insert(listOfValuesAsString) 而不是使用 INSERT/UPDATE 因为将来你可能有更多的列?
  • @Gustek 好吧,我希望能够在同一个操作块中进行惰性或更新。这是因为它将节省对数据库服务器的额外调用,这将(从长远来看)节省大量的处理能力和金钱。
  • 所以也许您只需要insert on duplicate 或者如果不提供您尝试制作的伪程序代码。

标签: php mysql codeigniter stored-procedures insert-update


【解决方案1】:

这不是一个确定的答案,但可以尝试一下。

如果您想避免在过程中发送许多参数,您可以创建一个名为foos_tmp 的表,其结构相同foos,但多了一个字段id_foos_tmp(pk 和自动增量)并在表@ 中输入数组987654324@。然后,您只发送生成的表foos_tmpid_foos_tmp 的过程,并在内部执行SELECT foos_tmp 表并获取您之前在数组中的数据的过程。

希望对你有所帮助。

您好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-16
    • 1970-01-01
    • 1970-01-01
    • 2017-04-17
    相关资源
    最近更新 更多