所以这是我的问题。我知道这个网站上有很多关于此类问题的文献,但我对其中几个问题如何与我的问题交织在一起感到困惑。首先,我有一个行数据数组,需要根据该数组中的远程 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 ;
数据很多,计划如下。将此数据字符串化,将其发送到存储过程,然后根据需要更新或插入。类似于以下内容(请注意,这将发生在 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 表很可能会被扩展,而且我不想进一步制造错误。有没有一种方法可以动态地将数组的字符串表示形式的解析分离内容放入单个更新或插入语句中。我不确定这是否可能,但我觉得可能存在一种我不知道的解决方法。谢谢您的帮助。
最佳答案
这不是一个明确的答案,但它是一个尝试的选择。
如果您想避免在过程中发送许多参数,您可以创建一个名为 foos_tmp
的表,其结构与 foos
相同,但多了一个字段 id_foos_tmp
(pk 和自动增量)并将数组输入表 foos_tmp
中。然后,您仅发送生成的表 foos_tmp
的 id_foos_tmp
,并在内部执行 SELECT foos_tmp
表并获取您生成的数据的过程之前在数组中。
希望对您有所帮助。
问候。
关于php - 更新存储过程中的数组数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13592990/