2012-07-15 20 views
0

我正在嘗試創建一列並使其計數用戶所做的插入次數。列保持嘗試插入已存在的行的次數

一個例子就是讓事情更清楚:

+-------+----------------------------------+--------------+ 
| text |   md5     | insert_times | 
+-------+----------------------------------+---------+----+ 
| 123 | 202cb962ac59075b964b07152d234b70 |  834  | 
| abc | 900150983cd24fb0d6963f7d28e17f72 |  923  |  
+-------+----------------------------------+--------------+ 

其中text是主鍵。
每當用戶試圖插入123(使用INSERT IGNORE不會收到錯誤消息,因爲123已存在)時,insert_times將增加1,記錄插入表中已有文本的嘗試次數。

有關如何製作它的任何想法?
我不能觸發器,因爲我的數據庫主機(godaddy)不允許觸發器。
如果mysql無法做到,可以在php的幫助下完成嗎?

回答

2

要在一個簡單的查詢中執行此操作,只需在MySQL中使用ON DUPLICATE KEY UPDATE函數即可。有了這個,您只需執行INSERT,然後在'重複'行中進行更新。例如:

INSERT INTO tbl (text, md5, insert_times) VALUES ('abc', {MD5}, 0} 
ON DUPLICATE KEY UPDATE insert_times+1; 

不過,我個人更喜歡PHP的做法,因爲在大多數的我查詢的東西通常不是添油加醋作爲一個簡單的更新:

$res = mysql_query(sprintf("SELECT text FROM tbl WHERE text = '%s'", $text)); 
if (mysql_num_rows($res) != 0) 
{ 
    mysql_query(sprintf("UPDATE tbl SET insert_times+1 WHERE text = '%s'", $text); 
} 
else 
} 
    mysql_query(sprintf("INSERT INTO tbl SET text = '%d', md5 = '%s'", $text, $hash); 
} 

這種方法留下了如果需要,還可以有更多空間觸發其他事件/功能。

+0

這非常有幫助!如果你能幫我找到一個SQL解決方案,如果你不能,那麼我會很感激!謝謝! – Algorithmatic 2012-07-15 04:19:42

+0

嗚嗚嗚嗚嗚嗚嗚嗚嗚......真是太明顯了!我會編輯我的答案。 – 2012-07-15 04:24:13

1

檢查該記錄是否已經存在於該表中,如果是,則將insert_times值更新爲insert_times+1; ,否則創建一個新的記錄。

0

您可以在腳本中放入一些邏輯來檢查行是否存在,然後再嘗試插入它。如果它不存在,請執行INSERT查詢。如果是這樣,請增加insert_times字段。

您也可以保留一個不具有唯一性約束的單獨insert_attempts表。對於每一次插入行的嘗試,您都會執行兩個查詢:您現在正在執行的查詢,以及insert_attempts的查詢。 insert_attempts可以插入一個新行,並且可以COUNT()具有相關ID的行,也可以檢查與該ID關聯的數字並更新它。

相關問題