0

所以这是我的问题。我知道这个网站上有很多关于这类问题的文献,但我对这些问题中的几个如何与我的问题交织在一起感到困惑。首先,我有一个行数据数组,需要根据该数组中的远程 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 表很可能会被扩展,我不想进一步创建错误。有没有办法将数组的字符串表示的解析分开的内容动态放置到单个更新或插入语句中。我不确定这是否可能,但我觉得可能存在我不知道的解决方法。感谢您的帮助。

4

1 回答 1

2

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

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

我希望它有所帮助。

问候。

于 2012-12-11T03:17:26.463 回答