2014-03-03 119 views
0

我使用一個類似的MySQL的約定輸入查詢表格信息插入或更新是否存在行

form_id - INT PRI 
user_id - INT 
field_name - VARCHAR 
field_value - TEXT 

我有一個PHP腳本,目前該遍歷所有的表單字段並首先檢查是否的foreach循環它存在,如果計數大於0,則更新該字段。如果它不存在,則它插入該行。不幸的是,我試圖通過PHP腳本處理超過一百個字段,並且這種方法證明非常耗時。什麼是更快的方式來做到這一點?我不認爲我可以使用on duplicate key update,因爲只有form_id是唯一的。

怎樣的每一行會是這樣的:

1, 1, name, Andy 
2, 1, date, 2012-10-05 
3, 2, name, John 

難道那種有意義嗎?

+0

這是個問題嗎? ;) – 2014-03-03 21:54:01

+1

如果你在foreach循環中插入數據,你應該在foreach循環中創建一個數組,然後使用數組插入一次數據 – Dan

+0

你使用PHP來構建MySQL語句,還是打開一個連接每個循環的迭代? – dsimer

回答

0

我看到這是MySQL。並且在描述之後,您正在使用PHP進行雙重工作。只需收集所有值並使用正確的SQL將它們釋放到數據庫中即可。爲此,您可以使用幾乎在所有數據庫系統上可用的MERGE STATEMENTS,只是使用不同的語法。合併語句插入一行,如果一行已經存在,它只是用新值更新行。或者你可以說它應該忽略排等許多可能性。

例如(不是MySQL的!):

MERGE INTO tablename USING table_reference ON (condition) 
    WHEN MATCHED THEN 
    UPDATE SET column1 = value1 [, column2 = value2 ...] 
    WHEN NOT MATCHED THEN 
    INSERT (column1 [, column2 ...]) VALUES (value1 [, value2 ... 

在MySQL這是一個有點不同。在那裏,您使用INSERT... ON DUPLICATE UPDATE

http://dev.mysql.com/doc/refman/5.1/en/insert-on-duplicate.html

對於這種這裏有一個例子(沒有使用你的字段):

INSERT INTO table (table.a, table.b, table.c, table.d) -- define your insert statement 
VALUES -- use the VALUES command to add several rows, or just one. Depends on your interface 
('key1','key2','exampleVal','exampleValb'), 
('key1','key3','exampleVal2131','exampleValasfasf') 
ON DUPLICATE KEY UPDATE -- Here the check appears. If the Values with key (a) + key (b) exist it will just UPDATE the fields c and d with VALUES(table.c) and VALUES(table.d) 
table.c = VALUES(table.c), 
table.d = VALUES(table.d) 

我希望我做了這個無論如何理解的。但是這可以節省你很多時間!

+0

我試過重複密鑰更新,但每次都會插入。 – ashin999

+0

這些字段應該是主鍵,如果你比較它們,因爲這是這個檢查的內容,因爲沒有定製的邏輯。在輸入它們時不會比較這些值。它正在比較您爲主鍵添加的值。而不是主鍵,你也可以有一個獨特的索引afaik。 – creativeby

相關問題