在MySQL中创建实现自增的序列(Sequence)的方法教程由于我们业务的需要,我们以前数据的使用item_id[MD5+time]的 生成方式太过冗余,我们考虑使用数字来表示,如果使用时间戳,可能会有重复的情况,我们觉得还不是那么的好,所以想到了利用一个独立的自增 的sequence来解决该问题。由于mysql和oracle不太一样,不支持直接的sequence,所以需要创建一张table来模 拟sequence的功能:首先:我们要创建--Sequence管理表?1234567DROPTABLEIFEXISTSs equence;CREATETABLEsequence(?nameVARCHAR(30)NOTNULL,?curr ent_valueINTNOTNULL,??incrementINTNOTNULLDEFAULT1,?PRIM ARYKEY(name))ENGINE=InnoDB;388棋牌http://www.455573.com其次我们要 创建几个函数用以实现对表的操作:1创建--取当前值的函数?12345678910111213141516171819DROPF UNCTIONIFEXISTScurrval;DELIMITER$CREATEFUNCTIONcurrval(s eq_nameVARCHAR(30))?RETURNSINTEGER?LANGUAGESQL?DETERMINISTIC ?CONTAINSSQL?SQLSECURITYDEFINER?COMMENT''''BEGIN?DECLAREvalu eINTEGER;?SETvalue=0;?SELECTcurrent_valueINTOvalue?FROM sequence?WHEREname=seq_name;?RETURNvalue;END$DELIMITER;2 创建--取下一个值的函数?1234567891011121314151617DROPFUNCTIONIFEXISTSnex tval;DELIMITER$CREATEFUNCTIONnextval(seq_nameVARCHAR(50)) ?RETURNSINTEGER?LANGUAGESQL?DETERMINISTIC?CONTAINSSQL?SQLS ECURITYDEFINER?COMMENT''''BEGIN?UPDATEsequence?SETcurrent_valu e=current_value+increment?WHEREname=seq_name;?RETURNcur rval(seq_name);END$DELIMITER;捕鱼游戏http://www.44771.net3创建--更新 当前值的函数?1234567891011121314151617DROPFUNCTIONIFEXISTSsetval;D ELIMITER$CREATEFUNCTIONsetval(seq_nameVARCHAR(50),valueIN TEGER)?RETURNSINTEGER?LANGUAGESQL?DETERMINISTIC?CONTAINSSQL ?SQLSECURITYDEFINER?COMMENT''''BEGIN?UPDATEsequence?SETcurre nt_value=value?WHEREname=seq_name;?RETURNcurrval(seq_name );END$DELIMITER;(注:关于DELIMITER;可以点击这里)最后:我们要用以下数据设置创建的sequenc e名称以及设置初始值和获取当前值和下一个值。?1234INSERTINTOsequenceVALUES(''item_id '',0,1);??#插入一条数据,添加一个sequence名称和初始值,以及自增幅度SELECTSETVAL(''item_ id'',10);???????????????????#设置指定sequence的初始值SELECTCURRVAL(''ite m_id'');??????????????????????#查询指定sequence的当前值SELECTNEXTVAL(''it em_id'');??????????????????????#查询指定sequence的下一个值最最后就是我们使用python 去调用?12345678910111213141516171819importpymysql?#打开数据库连接(ip/数据库 用户名/登录密码/数据库名)db=pymysql.connect("localhost","root","xxxx"," xxxxx")#使用cursor()方法创建一个游标对象cursorcursor=db.cursor()#使用ex ecute()?方法执行SQL查询cursor.execute("SELECTNEXTVAL(''item_id'');")# 使用fetchone()方法获取单条数据.data=cursor.fetchone()db.commit()print( "Databaseversion:%s"%data)print(type(data))???????????????? ????????????#?这里返回的是一个tuple类型?num=list(data)[0]???????????? ??????????????#?如果我们想需要其他类型可以直接转换一下?或者l?ist或者?strprint(num)print(type(num))?????????????????????????????#?这里取了一个int类型?#关闭数据库连接棋牌评测网http://www.77884.netdb.close() |
|