2012-11-27 31 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表,並獲取您之前在數組中的數據。

我希望它有些幫助。

問候。