iT邦幫忙

1

mysql 新增數值時檢查是否有相同資料

我目前在做 購物車功能 最近發現一個問題 我不想要使用者加入重複項目的時候會多一筆 例:我先買了10隻筆 還沒結單(我在某個欄位做判斷假如他是B就是有購買 沒B就是還沒結單) 我在多買10隻筆 他不會變成兩筆 而是舊的10在加入10
(題外話: 一開始以為直接在列印的地方用SUM 結果在減數量的時候有問題 ==川)
請問這有辦法在寫入時做判斷嗎?

https://ithelp.ithome.com.tw/upload/images/20200620/20109685A46eMFAQFm.png

0
浩瀚星空
iT邦超人 1 級 ‧ 2020-06-20 14:10:46
最佳解答

就資料而言。「ON DUPLICATE KEY UPDATE」對你來說會比較好。
他會依照你的主鍵相依性來決定。
不過我相信你不懂如何建立複合式主鍵。去查一下學習吧。
要用ON DUPLICATE KEY招你一定得學的。

不過,你還是放棄sprintf的寫法好了。亂亂用還不如不要用。
以下是簡單的處理給你參考。沒值的話。就將資料新增。有值的話,就直接 count 數量+1處理。

INSERT INTO login_times (user_id, count) VALUES ('abc', 1) 
ON DUPLICATE KEY UPDATE count = count + 1;

如果真的沒辦法不行用複合性主鍵。那你還是乖乖的用select兩段式處理的方式。
怕被修改的話。就搭配一下交易吧。

看更多先前的回應...收起先前的回應...
求關注 iT邦新手 5 級 ‧ 2020-06-20 22:21:52 檢舉

不愧是 星空大大 真的直接點出我的缺點/images/emoticon/emoticon02.gif

不好意思 這句話 我不是很懂"怕被修改的話。就搭配一下交易吧。"

交易 = Transaction
不過我想如果你連複合式主鍵都不會了。

那交易對你來說可能會更有難度就是了。

求關注 iT邦新手 5 級 ‧ 2020-06-22 14:50:26 檢舉

抱歉 花這麼多時間才回
"ON DUPLICATE KEY UPDATE" 是成功了
可是現在有個問題 假如我A商品已經結單(狀態欄變成Y)
那再次新增的時候因該就會出現新的一筆 而不是繼續家在Y那筆
試了半天 都錯誤

$sql="select * from shop_cart where buy != 'Y'(
INSERT INTO shop_cart (user_name,user_phone,part_id,order_number)
VALUES('$insert_new0','$insert_new1','$insert_new2','$insert_new3')
ON DUPLICATE KEY UPDATE order_number = order_number + '$insert_new3'
)";

..............
我說真的,我不該要從何去說起了。
行為動作你混在一起搞??
多了那個select幹嘛?
為何不將這動作寫在程式??

拿sql做程式運算??
而且...你覺得有buy欄位值的。還需要「新增」動作??
都有資料了。還新增?????

求關注 iT邦新手 5 級 ‧ 2020-06-22 15:09:51 檢舉

因該是 這樣寫 你會比較清楚
我這個資料表分別放者 已結帳跟未結帳(判斷的欄位是"buy")
使用者:
我先買了 "1支筆 結帳"(此時buy已變成y) 我之後又買了一支筆問題發生了(我之後加入的這筆的數量會加到之前已經結帳的那支筆上)
目前我卡在這裡 我的感覺是 要再多一個判斷 當buy不是Y的時候
才會執行"ON DUPLICATE KEY UPDATE" 同一個項目數量新增 當他有Y的時候可以項目重複 數量不會新增

你先思考好「你覺得有buy欄位值的。還需要「新增」動作??」

不要拿資料庫跟程式混在一起想。
資料庫就是「是」寫,不是「不寫」

不要混在一起拿sql語法,當程式開發用。
搞到有點莫明奇妙的。

你會讓sql發瘋的。

求關注 iT邦新手 5 級 ‧ 2020-06-22 15:31:05 檢舉

我覺得因該要有 因為我買結帳後 之後還是會繼續買一樣的商品阿
這樣使用者就可以知道 假如我在6.20買過一次 6.22又買了
資料庫方面來看 這樣不就會有兩筆資料(兩個欄位buy都有Y) 還是說我哪邊邏輯怪怪的 抱歉請指導我

我想拿sql的原因是因為我覺得因該是要在寫入的時候就做判斷了
目前想到最笨的方法就是新建一個專門拿來放已經結帳的資料表

你現在說的已經不是程式上的問題了。而是規劃上的問題了。
依你的說法。「假如我在6.20買過一次 6.22又買了
資料庫方面來看 這樣不就會有兩筆資料」
這個論點就有幾個問題。

其一:兩筆資料是否合理:
這得看你這張表的特性為何,如果是購買記錄。這是合理的。
如果是購買數量。這是不合理的。

不過話題先轉回來。
就如說的。如果一次buy是y,一次buy是n。那請問兩筆記錄是否都得要存在。

總結:
你沒搞清楚你這張表實際要記錄的性質是什麼。
有一個buy的欄位來區分買與不買。理論上這就是一種購買記錄。
每一個動作一筆記錄是很正常的。也根本不會有數量加入的問題存在。
但如果有需要buy為y就得加入的動作。
理論上這個就不該從sql下手。正常流程因該是要把原本n的刪除。然後直接加數量。這動作該從程式來處理。而不該從sql處理。

請讓sql完整的給於寫的動作就好。
你自已先清楚一下自已的規劃。

再回想我剛說的問題。有buy欄位就代表已存在資料。為何還需要一個新增的動作呢??
不要混合你的思考。就單單操作資料庫的想法就行。
執行行為方式,跟資料寫入方式。不要混在一起。

求關注 iT邦新手 5 級 ‧ 2020-06-22 16:28:43 檢舉

我覺得我之前的資料表思考方向比較像
購物車(記錄買了甚麼產品名稱、數量)
+
購買紀錄(什麼時候購買買了甚麼數量)
看了你的說明有比較懂問題了 感恩

我接下來可能就是將這兩個拆開 這個問題就自動解開了

WQ iT邦新手 3 級 ‧ 2020-06-23 16:17:45 檢舉

就....一個是明細檔,一個是結算檔....

4
archer9080
iT邦新手 5 級 ‧ 2020-06-20 09:34:30

不存在才 INSERT,存在就 skip
試試看是否是您想要的

看更多先前的回應...收起先前的回應...
求關注 iT邦新手 5 級 ‧ 2020-06-20 11:07:53 檢舉

現在有個問題 他需要key重複來做判斷 我資料庫這樣設不對嗎??

我是想說使用者一定會重複 所以不能當主鍵,料號也是 所以現在很難辦

$sql=sprintf("
INSERT INTO shop_cart(user_name,user_phone,part_id,order_number) 
VALUES
('%s','%s','%s','%s')
ON DUPLICATE KEY UPDATE 
order_number= order_number + '%s'"
,$insert_new0,$insert_new1,$insert_new2,$insert_new3,$insert_new3);
wrxue iT邦新手 4 級 ‧ 2020-06-20 11:23:27 檢舉

可以(使用者,料號)一組一起當主鍵

判斷是否重複(存在)的語句在這段

WHERE NOT EXISTS (
  SELECT 1 FROM `trip` WHERE `user` = "tony" AND `country` = "US" LIMIT 1
);

//當user=tony且country=US,NOT EXISTS就新增
你應該是判斷目前接收到的料號是否已存在?
所以應該是

WHERE part_id='$part_id'  

又是編輯完才看到補充@~@

求關注 iT邦新手 5 級 ‧ 2020-06-20 12:03:20 檢舉

我因該是要使用"如果不存在就 INSERT,存在就 UPDATE" 不能跳過

最近發現一個問題 我不想要使用者加入重複項目的時候會多一筆 例:我先買了10隻筆 還沒結單(我在某個欄位做判斷假如他是B就是有購買 沒B就是還沒結單) 我在多買10隻筆 他不會變成兩筆 而是舊的10在加入10

可是你的例子不會產生你問的問題呀(重複項目多買10隻筆,舊的10再加入10 --> 不是不會多一筆嗎)

求關注 iT邦新手 5 級 ‧ 2020-06-20 22:07:09 檢舉

"如果不存在才 INSERT,存在就 skip" 說明這樣說 我的理解是如果有他不會做任何事情?

0
rogeryao
iT邦高手 1 級 ‧ 2020-06-20 11:41:31

這個問題很有趣....
A : 以結帳(消費者要付費了)來區分的話 :
1.結帳前 : 資料只在網頁上就 javascript 之類的處理就好了 :
若是買10隻筆 => 商品 = 筆 , 數量 = 10 ;
在多買10隻筆 => 商品 = 筆 , 數量 = 20 ;
2.結帳後 : 寫到 mysql 內只會有一筆資料 ,不是寫入筆 10 就是寫入筆 20

B : 若是要記錄購物車內容(寫到 mysql)
購物車序號 => XX
若是買10隻筆 => 商品 = 筆 , 數量 = 10 ;
=> Insert ...購物車序號 values('XX'....
在多買10隻筆 => 商品 = 筆 , 數量 = 20 ;
=> Update ... where 購物車序號 = 'XX'

我要發表回答

立即登入回答