在MySQL中,使用auto_increment類型的id字段作為表的主鍵,并用它作為其他表的外鍵,形成“主從表結(jié)構(gòu)”,這是數(shù)據(jù)庫(kù)設(shè)計(jì)中常見(jiàn)的用法。但是在具體生成id的時(shí)候,我們的操作順序一般是:先在主表中插入記錄,然后獲得自動(dòng)生成的id,以它為基礎(chǔ)插入從表的記錄。這里面有個(gè)困難,就是插入主表記錄后,如何獲得它對(duì)應(yīng)的id。通常的做法,是通過(guò)“select max(id) from tablename”的做法,但是顯然這種做法需要考慮并發(fā)的情況,需要在事務(wù)中對(duì)主表加以“X鎖“,待獲得max(id)的值以后,再解鎖。這種做法需要的步驟比較多,有些麻煩,而且并發(fā)性也不好。有沒(méi)有更簡(jiǎn)單的做法呢?答案之一是通過(guò)select LAST_INSERT_ID()這個(gè)操作。乍一看,它和select max(id)很象,但實(shí)際上它是線程安全的。也就是說(shuō)它是具體于數(shù)據(jù)庫(kù)連接的。下面通過(guò)實(shí)驗(yàn)說(shuō)明:
創(chuàng)新互聯(lián)公司主要從事網(wǎng)頁(yè)設(shè)計(jì)、PC網(wǎng)站建設(shè)(電腦版網(wǎng)站建設(shè))、wap網(wǎng)站建設(shè)(手機(jī)版網(wǎng)站建設(shè))、響應(yīng)式網(wǎng)站開(kāi)發(fā)、程序開(kāi)發(fā)、網(wǎng)站優(yōu)化、微網(wǎng)站、微信小程序開(kāi)發(fā)等,憑借多年來(lái)在互聯(lián)網(wǎng)的打拼,我們?cè)诨ヂ?lián)網(wǎng)網(wǎng)站建設(shè)行業(yè)積累了豐富的成都網(wǎng)站建設(shè)、網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)、網(wǎng)絡(luò)營(yíng)銷經(jīng)驗(yàn),集策劃、開(kāi)發(fā)、設(shè)計(jì)、營(yíng)銷、管理等多方位專業(yè)化運(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)前會(huì)話的值,而使用IDENT_CURRENT()會(huì)獲得在某個(gè)IDENTITY字段上插入的最大值,而不區(qū)分不同的會(huì)話。
注:使用select last_insert_id()時(shí)要注意,當(dāng)一次插入多條記錄時(shí),只是獲得第一次插入的id值,務(wù)必注意!可以試試
insert into tb(c1,c2) values (c1value,c2value),(c1value1,c2value2)..。
1、不要發(fā)mysql的東西到sqlserver,不保證所有人都懂,發(fā)到mysql對(duì)解決你的問(wèn)題更加有益。
2、你先別into,看看彈出的select?last_insert_id()?能不能出來(lái)
3、即使能出來(lái),貌似并發(fā)情況下你這種方法也是有問(wèn)題,sqlserver可以使用IDENT_CURRENT('數(shù)據(jù)表名')或者SCOPE_IDENTITY()函數(shù)來(lái)獲取
select *? from (select row_number() over(partition by id order by create_tiem desc) rn, id, create_time, ... , ... from table )t1 where rn = 1;
在這里...代表的是字段名稱,將需要的字段名稱放在這里,需要哪些放那些。
SELECT t.*FROM (select * from `table` order by `create_time` desc limit 10000000000) t GROUP BY t.id;
在這里就是先將數(shù)據(jù)進(jìn)行排序然后再分組,然后取出的是最大的一個(gè)值,這里有點(diǎn)要注意,limit?10000000000這個(gè)根據(jù)不同的版本看是否要加這個(gè),5.5之前的不用加,之后的要加,反正加上肯定沒(méi)有錯(cuò)。
group by后取的一條數(shù)據(jù)默認(rèn)是按主鍵id排序后的第一條
工具/材料:Management Studio。
1、首先在桌面上,點(diǎn)擊“Management Studio”圖標(biāo)。
2、然后在該界面中,點(diǎn)擊左上角“新建查詢”按鈕。
3、之后在該界面中,輸入查詢指定id號(hào)SQL語(yǔ)句“select * from myAudit where ID =1;”。
4、接著在該界面中,點(diǎn)擊上方工具欄里“執(zhí)行”按鈕。
6、最后在該界面中,顯示指定id號(hào)的數(shù)據(jù)。
1. 數(shù)據(jù)庫(kù)自增ID——來(lái)自Flicker的解決方案
因?yàn)镸ySQL本身支持auto_increment操作,很自然地,我們會(huì)想到借助這個(gè)特性來(lái)實(shí)現(xiàn)這個(gè)功能。Flicker在解決全局ID生成方 案里就采用了MySQL自增長(zhǎng)ID的機(jī)制(auto_increment + replace into + MyISAM)。一個(gè)生成64位ID方案具體就是這樣的:
先創(chuàng)建單獨(dú)的數(shù)據(jù)庫(kù)(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