在存储过程中更新数组数据

时间:2012-11-27 21:03:18

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

所以这是我的问题。我知道这个网站上有很多关于这类问题的文献,但我对这些问题中的几个如何交织我的问题感到困惑。首先,我有一个行数据数组,需要根据该数组中的远程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 ;

有很多数据,计划如下。 String-ify此数据将其发送到存储过程,然后根据需要进行更新或插入。类似下面的内容(请注意,这将发生在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表很可能会被扩展,我不想再创建bug下线。有没有办法将解析后的数组字符串表示形式的内容动态放入单个update或insert语句中。我不确定这是否可行,但我觉得这是一个我不知道可能存在的工作。谢谢你的帮助。

1 个答案:

答案 0 :(得分:2)

这不是一个明确的答案,但尝试是一种选择。

如果你想避免在程序中发送许多参数,你可以创建一个名为foos_tmp的表,其结构foos相同,但有一个字段aditional id_foos_tmp(pk和autoincrement)和输入表foos_tmp中的数组。然后,您只发送表id_foos_tmp的{​​{1}}生成的过程,并在内部执行SELECT foos_tmp表的过程,并获取之前在数组中的数据。

我希望它有所帮助。

问候。