MySql 更新時(shí)返回主鍵id
來源:程序員人生 發(fā)布時(shí)間:2015-02-26 21:01:37 閱讀次數(shù):5933次
最近做項(xiàng)目,遇到1個(gè)邏輯,就是在修改單條記錄時(shí)需要返回該記錄的id。
先說1下我的使用環(huán)境,springMVC+MyBatis,因而上度娘查了1下,將結(jié)果記錄1下,僅供往后參考和大家們共同探討
具體邏輯就是在多個(gè)條件下,包括1個(gè)嵌套查詢,對(duì)1條記錄進(jìn)行更新,并返回該記錄的主鍵id,在這個(gè)查詢語句里面用到1個(gè)變量update_id在履行更新語句的時(shí)候?qū)⒈居涗浀膇d重新賦值為本身的id,同時(shí)將本身的id賦值給updatge_id這個(gè)變量,最后返回這個(gè)變量,就是這個(gè)更新最后的目的。
SET @update_id := 0;
UPDATE activity_prize_voucher apv
SET apv.mobile = 18888888888,
apv.state = 1,
apv.exchange_time = NOW(),
apv.id =(SELECT @update_id := id)
WHERE
apv.prize_id = 2
AND apv.state = 0
AND mobile IS NULL
AND exchange_time IS NULL
<span style="color:#ff0000;">AND(
SELECT
vv.exchangeCount <= 2000
FROM
(
SELECT
COUNT(*)AS exchangeCount
FROM
activity_prize_voucher apvv
WHERE
apvv.prize_id = 2
AND apvv.state = 1
AND DATE_FORMAT(NOW(), '%Y%m%d')= DATE_FORMAT( apvv.exchange_time, '%Y%m%d' )
)AS vv
)</span>
LIMIT 1;
SELECT
@update_id;
在 Mapper.xml內(nèi)的標(biāo)簽使用為select標(biāo)簽
<select id="exchangeVoucher" parameterType="hashmap" resultType="java.lang.Integer">
SQL
</select>
在java Dao內(nèi)方法為:
int exchangeVoucher(Map<String, Object> queryParams);
就這么簡(jiǎn)單,這個(gè)功能就初步完成,下面對(duì)這個(gè)邏輯進(jìn)行優(yōu)化調(diào)劑
=================分割線=========================
好,在華麗麗的分割線下面我們?cè)谟懻?下上面那段sql里面紅色彩的,在MySQL里面如果要在upadte和delete里面用嵌套查詢1般是不行的,但是如果你將這個(gè)嵌套查詢AS為1個(gè)對(duì)象,然后在對(duì)這個(gè)對(duì)象進(jìn)行查詢應(yīng)當(dāng)就能夠了。
但是,在這里MySQL鎖定WHERE條件掃描過的所有索引記錄,在高并發(fā)的時(shí)候就會(huì)致使紅色語句出現(xiàn)死鎖現(xiàn)象,那末問題來了,如何控制紅色字體的條件,由于紅色區(qū)域內(nèi)的語句只是用來統(tǒng)計(jì)1定條件下的數(shù)量的,所以只能通過代碼邏輯進(jìn)行獨(dú)立控制。
最后將紅色字體代碼舍去,在履行更新語句之前進(jìn)行邏輯判斷來控制。
如果哪位達(dá)人有更好的方法,希望給我反饋,謝謝。我這里只是拋磚引玉。
生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對(duì)您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈(zèng)