使用觸發(fā)器
我們提供的服務(wù)有:成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè)、外貿(mào)網(wǎng)站建設(shè)、微信公眾號開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、陽曲ssl等。為上千余家企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的陽曲網(wǎng)站制作公司
在一條insert語句觸發(fā)時(shí),使用SELECT md5(RAND() + new.id);可以生成32位唯一的ID。
修改就行了
create table student(
id int(5) not null auto_increatment,
name varchar(20) not null,
age int(3) not null,
primary key(id));/*建表時(shí)加入這句話就可以,id是自增長的字段名稱,或者在客戶端要建的字段的屬性上勾選自增長 primary key*/
因?yàn)镸ySQL本身支持auto_increment操作,很自然地,我們會想到借助這個(gè)特性來實(shí)現(xiàn)這個(gè)功能。Flicker在解決全局ID生成方 案里就采用了MySQL自增長ID的機(jī)制(auto_increment + replace into + MyISAM)。一個(gè)生成64位ID方案具體就是這樣的:
先創(chuàng)建單獨(dú)的數(shù)據(jù)庫(eg:ticket),然后創(chuàng)建一個(gè)表:
CREATE TABLE Tickets64 (
id bigint(20) unsigned NOT NULL auto_increment,
stub char(1) NOT NULL default '',
PRIMARY KEY (id),
UNIQUE KEY stub (stub)
) ENGINE=MyISAM
在MySQL中,使用auto_increment類型的id字段作為表的主鍵,并用它作為其他表的外鍵,形成“主從表結(jié)構(gòu)”,這是數(shù)據(jù)庫設(shè)計(jì)中常見的用法。但是在具體生成id的時(shí)候,我們的操作順序一般是:先在主表中插入記錄,然后獲得自動生成的id,以它為基礎(chǔ)插入從表的記錄。這里面有個(gè)困難,就是插入主表記錄后,如何獲得它對應(yīng)的id。通常的做法,是通過“select max(id) from tablename”的做法,但是顯然這種做法需要考慮并發(fā)的情況,需要在事務(wù)中對主表加以“X鎖“,待獲得max(id)的值以后,再解鎖。這種做法需要的步驟比較多,有些麻煩,而且并發(fā)性也不好。有沒有更簡單的做法呢?答案之一是通過select LAST_INSERT_ID()這個(gè)操作。乍一看,它和select max(id)很象,但實(shí)際上它是線程安全的。也就是說它是具體于數(shù)據(jù)庫連接的。下面通過實(shí)驗(yàn)說明:
1、在連接1中向A表插入一條記錄,A表包含一個(gè)auto_increment類型的字段。
2、在連接2中向A表再插入一條記錄。
3、結(jié)果:在連接1中執(zhí)行select LAST_INSERT_ID()得到的結(jié)果和連接2中執(zhí)行select LAST_INSERT_ID()的結(jié)果是不同的;而在兩個(gè)連接中執(zhí)行select max(id)的結(jié)果是相同的。
其實(shí)在MSSQL中SCOPE_IDENTITY()和IDENT_CURRENT()的區(qū)別和這里是類似的。使用SCOPE_IDENTITY()可以獲得插入某個(gè)IDENTITY字段的當(dāng)前會話的值,而使用IDENT_CURRENT()會獲得在某個(gè)IDENTITY字段上插入的最大值,而不區(qū)分不同的會話。
注:使用select last_insert_id()時(shí)要注意,當(dāng)一次插入多條記錄時(shí),只是獲得第一次插入的id值,務(wù)必注意!可以試試
insert into tb(c1,c2) values (c1value,c2value),(c1value1,c2value2)..。