MYSQL實現序列自增
阿新 • • 發佈:2018-12-16
MYSQL實現Sequence
由於專案需求,需要實現
Sequence
效果,MYSQL中是不支援Sequence
,只支援主鍵自增Increment
,但也只是自增,而不能設定步長、開始索引、是否迴圈等,最重要的是一張表只能由一個欄位使用自增,但有的時候我們需要兩個或兩個以上的欄位實現自增(單表多欄位自增),MYSQL本身是實現不了的,但我們可以用建立一個序列表,使用函式來獲取序列的值
資料庫構建
1. 新建序列表
drop table if exists sequence; create table sequence ( seq_name VARCHAR(50) NOT NULL, -- 序列名稱 current_val INT NOT NULL, -- 當前值 increment_val INT NOT NULL DEFAULT 1, -- 步長(跨度) PRIMARY KEY (seq_name) );
2. 新增一個序列
INSERT INTO sequence VALUES ('seq_test1_num1', '0', '1');
INSERT INTO sequence VALUES ('seq_test1_num2', '0', '2');
3. 建立 函式 用於獲取序列當前值(v_seq_name 引數值 代表序列名稱)
create function currval(v_seq_name VARCHAR(50)) returns integer begin declare value integer; set value = 0; select current_val into value from sequence where seq_name = v_seq_name; return value; end;
4.查詢當前值
select currval('seq_test1_num1');
5. 建立 函式 用於獲取序列下一個值(v_seq_name 引數值 代表序列名稱)
create function nextval (v_seq_name VARCHAR(50)) returns integer begin update sequence set current_val = current_val + increment_val where seq_name = v_seq_name; return currval(v_seq_name); end;
6. 查詢下一個值
select nextval('seq_test1_num1');
併發測試
在這裡使用JAVA
程式進行多執行緒的併發測試
@Autowired
private JdbcTemplate jdbcTemplate;
@Test
public void contextLoads() throws InterruptedException {
ExecutorService executorService = Executors.newFixedThreadPool(3);
CountDownLatch countDownLatch = new CountDownLatch(3);
log.info("Task start !!!");
for (int i = 0; i < 3; i++) {
executorService.submit(() -> {
for (int t = 0; t < 10000; t++) {
jdbcTemplate.execute("select nextval('seq_test1_num1')");
}
countDownLatch.countDown();
});
}
countDownLatch.await();
executorService.shutdown();
log.info("Task end !!!");
}
注意:
使用執行緒池來模擬併發情況