Mysql下生成序列的方法

2021-08-27 16:51:35 字數 1422 閱讀 3624

我們可以把資料庫表的主鍵設定成自增長的,這樣插入資料庫的時候不用關心主鍵是什麼,資料庫會自動生成,用起來很方便。但是有的時候如果應用程式能 在插入資料前就知道主鍵的話就更好了。oracle等資料庫支援sequence功能,可以方便地獲得乙個不重複的序列,並且保證在多個客戶端併發訪問下 不會出現重複的值。

mysql沒有這項功能,我曾經自己寫一段程式來實現它。為了讓它在併發訪問下是安全的,使用了innodb的行級鎖,以前用起來也沒有問題。這一方案就是在建乙個表,表中乙個列儲存序列值,這樣每次只要在乙個事務裡執行

1

2

selectidfromseqwherename='order_id'forupdate;

updateseqsetid = id + stepwherename='order_id';

就可安全地獲得新序列值了。一般 step設成1,為了減少查詢次數,可以把step放大些,這樣等於一次性取出很多值,由應用程式確保不會被重複使用。這一實現需要事務的支援,對於不支援事務也不支援行級鎖的myisam就不好了。

最近做專案的時候,我的同事發現spring裡面內建了這樣的工具類來做這個事情。原來spring早就有這個工具了,我一直都不知道,孤陋寡聞了。spring的這個工具類是org.springframework.jdbc.support.incrementer.mysqlmaxvalueincrementer,不僅有mysql版的,還有其它資料庫版的。看了一下這個類的源**,又查了一下mysql的文件,原來mysql內建的last_insert_id()函式可以模擬sequence的效果,簡單實用也不需要事務支援。做法就是:

先建一張表來存序列值:

mysql> create table sequence (id int not null);

mysql> insert into sequence values (0);

再通過執行以下語句來獲取下乙個序列值:

mysql>

update sequence set id=last_insert_id(id+1);

mysql> select last_insert_id();

mysql會保證last_insert_id()在併發訪問的時候不會出現問題。

12 1 生成序列

12.1 生成序列 生成序列有幾種方法,先來看一下我們的選擇,直接的方法是實現ienumerator 介面,提供 current 屬性,和 movenext方法,將列舉數物件移動到下乙個元素。這要求顯式建立有可變狀態的物件,很明顯違反了函式式風格。通常的做法是隱藏可變性,提供更具宣告式的方法,表達生...

12 1 生成序列

12.1 生成序列 有幾種生成序列的技術,我們來看一下我們的選項。直接的方法是實現 ienumerator 介面,提供 current 屬性和 movenext 方法,它將列舉數物件移動到下乙個元素。這迫使我們顯式建立有可變狀態的物件,這很明顯違反了函式式的風格。通常,我們可以應用隱藏可變異的技術,...

序列生成 序列生成 SeqGAN和RankGAN

這篇文章主要介紹兩個序列生成的gan模型,分別是發表在aaai 2017上的seqgan和 nips 2017上的 rankgan seqgan sequence generative adversarial nets with policy gradient arxiv.org adversari...