1、為什么auto_increament沒有回滾?
創(chuàng)新互聯(lián)建站于2013年成立,先為旅順口等服務(wù)建站,旅順口等地企業(yè),進行企業(yè)商務(wù)咨詢服務(wù)。為旅順口企業(yè)網(wǎng)站制作PC+手機+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。
因為innodb的auto_increament的計數(shù)器記錄的當前值是保存在存內(nèi)
存中的,并不是存在于磁盤上,當mysql
server處于運行的時候,這個計數(shù)值只會隨著insert改增長,不會隨著delete而減少。而當mysql
server啟動時,當我們需要去查詢auto_increment計數(shù)值時,mysql便會自動執(zhí)行:SELECT
MAX(id)
FROM
表名
FOR
UPDATE;語句來獲得當前auto_increment列的最大值,然后將這個值放到auto_increment計數(shù)器中。所以就算
Rollback
MySQL的auto_increament計數(shù)器也不會作負運算。
2、MySQL的事務(wù)對表操作的時候是否是物理操作?
MySQL的事務(wù)是有redo和undo的,redo操作的所有信息都是記錄到
redo_log中,也就是說當一個事務(wù)做commit操作時,需要先把這個事務(wù)的操作寫到redo_log中,然后再把這些操作flush到磁盤上,當
出現(xiàn)故障時,只需要讀取redo_log,然后再重新flush到磁盤就行了。
而對于undo就比較麻煩,MySQL在處理事務(wù)時,會在數(shù)據(jù)共享
表空間里申請一個段叫做segment段,用保存undo信息,當在處理rollback,不是完完全全的物理undo,而是邏輯undo,就是說會對之
前的操作進行反操作,但是這些共享表空間是不進行回收的。這些表空間的回收需要由mysql的master
thread進程來進行回收。
select count(*),分組列 from 表名 group by 分組列 having flag=1;
按分組列分組,返回組中含flag=1的記錄數(shù)
例子:
id 省份 flag
1 河北 1
2 河北 2
3 河南 2
4 河南 2
select count(*),省份 from 表名 group by 省份 having flag=1;
得出結(jié)果為
河北 flag含1
我的理解是,你在嘗試往字段中追加字符,插入字段用程序處理一下,比如先取出來,然后explode,然后循環(huán)數(shù)組處理,如果有的值從1,4,5中unset掉,沒有的值追加到數(shù)組中,然后在implode成1,2,3,4,5的樣子,然后再插入,目前mysql應(yīng)該不能直接實現(xiàn)。
如果需要按照由小到大排序可以在implode之前先用sort排序一下
用ifnull函數(shù)。
比如這樣:
select?ifnull(null,0)
顯示結(jié)果就是0
思路:非整數(shù)就是小數(shù)了,先轉(zhuǎn)為字符串,然后看看字符串中是否包含小數(shù)點.
SELECT LOCATE('.', 數(shù)值) 是否等于0