作者joedenkidd (優質的藍色射手)
看板PHP
標題[請益] 資料重複寫入問題?
時間Fri Nov 21 10:57:25 2014
Hi All:
$up_sql="update db set value=1 where id='123' and sn='2345'";
$up_exec=pg_exec($server_link,$up_sql);
$up_result=pg_affected_rows($up_exec);
if($up_result==0)
{
$ins_sql="insert into db(id,sn) values('234','aaa')";
$ins_exec=pg_exec($server_link,$ins_sql);
}
以上是我資料更新或新增的程式,正常來說,當 db裡面有 id='123',sn='2345'的時候
pg_affected_rows的值並不會等於0
所以我用這種方式來判斷資料是要更新或是新增,
可是觀察了一陣子,發現還是有部分的資料,會
被重復寫入,不知道這樣子是出了什麼問題,請
各位指點一下,拜託...
程式:PHP
DB : POSTGRESQL
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 118.169.170.134
※ 文章網址: http://webptt.com/m.aspx?n=bbs/PHP/M.1416538648.A.274.html
1F:推 alog: db資料是有更新才affected 不是你下完指令執行成功就算 11/21 11:10
2F:→ alog: 如果你要避免部分資料進入資料庫 要做好檢查 11/21 11:11
3F:→ alog: 適時配合lock相關指令做搭配 以及你要利用unique key避免重 11/21 11:12
4F:→ alog: 複寫入 11/21 11:12
5F:→ joedenkidd: 應該是說問題會發生在下一次相同資料寫入的時候 11/21 12:34
6F:推 alog: 簡單作法 挑幾個你認為不該重複的欄位資料 11/21 12:46
7F:→ alog: 例如 name cellphone sexual 11/21 12:47
8F:→ alog: 然後你新增一個名為digest的資料欄位 長度用32 char 11/21 12:49
9F:→ alog: 並設定他為 unique key 11/21 12:49
10F:→ alog: 接著你新增資料的時候 記得產生一組字串 11/21 12:51
11F:推 alog: $digest = md5(json_encode(array($name,$cellphone,$sexual 11/21 12:52
12F:→ alog: ))); 11/21 12:52
13F:→ alog: 把這整組資料放進資料庫裡 11/21 12:53
14F:推 alog: 有重複的 資料庫會自己擋下來 11/21 12:54
15F:推 LaPass: unique key 我記得可以同時設在兩個鍵上 11/21 13:06
16F:→ LaPass: 把兩個欄位當成一組,去判斷兩者都一樣才當一樣,這樣 11/21 13:07
17F:→ joedenkidd: alog大大說的,是一個好方式,db已有資料,以後可用~ 11/21 19:39
18F:→ joedenkidd: LaPass大大,unique key分別設定兩個欄位ok,但資料庫 11/21 19:40
19F:→ joedenkidd: 中,id會重復,sn也會,所以只有那個條件在一起來能 11/21 19:40
20F:→ joedenkidd: 得到唯的一值,怪的只是不知道為什會發生這種問題 11/21 19:45
21F:推 xdraculax: 一樓就說啦,那個只數有更新,本來就=1就不算了 11/22 00:57
22F:→ xdraculax: mysql可以用replace into pg 不熟 11/22 01:10
23F:推 LaPass: 我的意思是,設定 id+sn unique這樣,「兩個一組」 11/22 01:29