2012-11-27 72 views
0

所以这是我的问题。我知道这个网站上有关于这类问题的一些文献,但我很困惑这些问题是如何交织在一起的。首先,我需要根据阵列中的远程ID值更新或插入一行数据,在此例中为value_c。该数组对应于表foo中的行实例。基本上,如果数据库中存在匹配value_c的记录,则更新该记录,否则插入新记录有效负载。数组的数据结构对应于我们数据库中的表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 ; 

有大量的数据,并在为接下来的计划。字符串 - 如果此数据将其发送到存储过程,然后根据需要更新或插入。像下面这样(注意,这将在模型笨内发生):作为跟随

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表很可能会被扩展,并且我不想在该行的更远处创建错误。有没有办法将一个数组的字符串表示的解析分离内容动态放置到单个更新或插入语句中。我不确定这是否可能,但我觉得自己可能存在一种我不知道的工作。感谢您的帮助。

+0

您的意思是说您希望有一个过程update_or_insert(listOfValuesAsString)而不是使用INSERT/UPDATE,因为将来您可能会有更多的列? – Gustek

+0

@Gustek嗯,它更多的是我想能够惰性或更新在同一个操作块。这是因为它可以节省对数据库服务器的额外呼叫,从长远来看,这将节省大量的处理能力和资金。 – usumoio

+0

所以,也许你只需要[插入重复](http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html),或者如果不提供伪代码的程序,你试图使。 – Gustek

回答

2

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

如果你想避免发送许多参数的过程,你可以创建一个表中调用foos_tmp具有相同的结构foos但有一个领域aditional的id_foos_tmp(PK和自动增量),并在表foos_tmp输入数组。然后您只发送表foos_tmp的程序id_foos_tmp,并在内部生成一个SELECT foos_tmp表,并获取您之前在数组中的数据。

我希望它有些帮助。

问候。