天天看點

mysql自增和序列的差別_mysql 自增序列(轉)

1:原理是在建立一個觸發器TRIGGER tri_NewBH  在table插入時執行序列計算

mysql> CREATE TABLE tb(BH CHAR(16),content VARCHAR(20),`date` DATETIME,val INT);

Query OK, 0 rows affected (0.05 sec)

mysql>

mysql>

mysql> DELIMITER $$

mysql> DROP TRIGGER IF EXISTS tri_NewBH $$

Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql>

mysql> CREATE TRIGGER tri_NewBH BEFORE INSERT ON tb

-> FOR EACH ROW

-> BEGIN

-> DECLARE dt CHAR(8);

-> DECLARE bh_id CHAR(16);

-> DECLARE number INT;

-> DECLARE new_bh VARCHAR(16);

->

-> SET dt = DATE_FORMAT(CURDATE(),'%Y%m%d');

->

-> SELECT

-> MAX(BH) INTO bh_id

-> FROM tb

-> WHERE BH LIKE CONCAT(dt,'%');

->

-> IF bh_id = '' OR bh_id IS NULL THEN

-> SET new_bh = CONCAT(dt,'');

-> ELSE

-> SET number = RIGHT(bh_id,8) + 1;

-> SET new_bh = RIGHT(CONCAT('',number),8);

-> SET new_bh=CONCAT(dt,new_bh);

-> END IF;

->

-> SET NEW.BH = new_bh;

-> END$$

Query OK, 0 rows affected (0.09 sec)

mysql>

mysql> DELIMITER ;

mysql> INSERT INTO tb(content,`date`,val) VALUES('LiangCK','2009-05-11',20);

Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO tb(content,`date`,val) VALUES('LiangCK','2009-05-11',20);

Query OK, 1 row affected (0.01 sec)

mysql> INSERT INTO tb(content,`date`,val) VALUES('LiangCK','2009-05-11',20);

Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO tb(content,`date`,val) VALUES('LiangCK','2009-05-11',20);

Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO tb(content,`date`,val) VALUES('LiangCK','2009-05-11',20);

Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO tb(content,`date`,val) VALUES('LiangCK','2009-05-11',20);

Query OK, 1 row affected (0.01 sec)

mysql> INSERT INTO tb(content,`date`,val) VALUES('LiangCK','2009-05-11',20);

Query OK, 1 row affected (0.00 sec)

mysql> SELECT * FROM tb;

+------------------+---------+---------------------+------+

| BH | content | date | val |

+------------------+---------+---------------------+------+

| 2009051100000001 | LiangCK | 2009-05-11 00:00:00 | 20 |

| 2009051100000002 | LiangCK | 2009-05-11 00:00:00 | 20 |

| 2009051100000003 | LiangCK | 2009-05-11 00:00:00 | 20 |

| 2009051100000004 | LiangCK | 2009-05-11 00:00:00 | 20 |

| 2011051200000001 | LiangCK | 2009-05-11 00:00:00 | 20 |

| 2011051200000002 | LiangCK | 2009-05-11 00:00:00 | 20 |

| 2011051200000003 | LiangCK | 2009-05-11 00:00:00 | 20 |

+------------------+---------+---------------------+------+

7 rows in set (0.00 sec)

2.下面就是另外一個的實作方案:

原理是建立一個專門記錄序列的表sequence,記錄有目前序列号,序列的間隔如+1

DROP TABLE IF EXISTS sequence;

CREATE TABLE sequence (

name VARCHAR(50) NOT NULL,

current_value INT NOT NULL,

increment INT NOT NULL DEFAULT 1,

PRIMARY KEY (name)

) ENGINE=InnoDB;

INSERT INTO sequence VALUES ('MovieSeq',3,5);

DROP FUNCTION IF EXISTS currval;

DELIMITER $

CREATE FUNCTION currval (seq_name VARCHAR(50))

RETURNS INTEGER

CONTAINS SQL

BEGIN

DECLARE value INTEGER;

SET value = 0;

SELECT current_value INTO value

FROM sequence

WHERE name = seq_name;

RETURN value;

END$

DELIMITER ;

測試一下結果:

mysql> SELECT currval('MovieSeq');

+---------------------+

| currval('MovieSeq') |

+---------------------+

| 3 |

+---------------------+

1 row in set (0.00 sec)

mysql> SELECT currval('x');

+--------------+

| currval('x') |

+--------------+

| 0 |

+--------------+

1 row in set, 1 warning (0.00 sec)

mysql> show warnings;

+---------+------+------------------+

| Level | Code | Message |

+---------+------+------------------+

| Warning | 1329 | No data to FETCH |

+---------+------+------------------+

1 row in set (0.00 sec)

nextval

//擷取下一個數值..先在sequence裡面調用update目前最大數值+1然後再調用currval獲得目前數值

DROP FUNCTION IF EXISTS nextval;

DELIMITER $

CREATE FUNCTION nextval (seq_name VARCHAR(50))

RETURNS INTEGER

CONTAINS SQL

BEGIN

UPDATE sequence

SET current_value = current_value + increment

WHERE name = seq_name;

RETURN currval(seq_name);

END$

DELIMITER ;

+---------------------+

| nextval('MovieSeq') |

+---------------------+

| 15 |

+---------------------+

1 row in set (0.09 sec)

mysql> select nextval('MovieSeq');

+---------------------+

| nextval('MovieSeq') |

+---------------------+

| 20 |

+---------------------+

1 row in set (0.01 sec)

mysql> select nextval('MovieSeq');

+---------------------+

| nextval('MovieSeq') |

+---------------------+

| 25 |

+---------------------+

1 row in set (0.00 sec)

setval

DROP FUNCTION IF EXISTS setval;

DELIMITER $

CREATE FUNCTION setval (seq_name VARCHAR(50), value INTEGER)

RETURNS INTEGER

CONTAINS SQL

BEGIN

UPDATE sequence

SET current_value = value

WHERE name = seq_name;

RETURN currval(seq_name);

END$

DELIMITER ;

+------------------------+

| setval('MovieSeq',150) |

+------------------------+

| 150 |

+------------------------+

1 row in set (0.06 sec)

mysql> select curval('MovieSeq');

+---------------------+

| currval('MovieSeq') |

+---------------------+

| 150 |

+---------------------+

1 row in set (0.00 sec)

mysql> select nextval('MovieSeq');

+---------------------+

| nextval('MovieSeq') |

+---------------------+

| 155 |

+---------------------+

1 row in set (0.00 sec)

更改(修改)mysql自動增序列改變從1000開始

更改(修改)mysql自動增序列改變從1000開始 ************************************************************************** ...

MySQL自增序列-親試ok

#1.建立sequence表,公共的 DROP TABLE IF EXISTS sequence; CREATE TABLE sequence (      name VARCHAR(30) NOT ...

mysql 資料庫自增id 的總結

有一個表StuInfo,裡面隻有兩列 StuID,StuName其中StuID是int型,主鍵,自增列.現在我要插入資料,讓他自動的向上增長,insert into StuInfo(StuID,Stu ...

MySQL 設計與開發規範

MySQL 設計與開發規範 1 目的 本規範的主要目的是希望規範資料庫設計與開發,盡量避免由于資料庫設計與開發不當而産生的麻煩:同時好的規範,在執行的時候可以培養出好的習慣,好的習慣是軟體品質的很好保 ...

達達O2O背景架構演進實踐:從0到4000高并發請求背後的努力

1.引言   達達創立于2014年5月,業務覆寫全國37個城市,擁有130萬注冊衆包配送員,日均配送百萬單,是全國領先的最後三公裡物流配送平台. 達達的業務模式與滴滴以及Uber很相似,以衆包的方式利 ...

mysql 模拟一個自增序列

文章出處:https://sdu0rj.axshare.com/%E4%BA%8C%E7%BA%A7%E5%AE%A2%E6%88%B7%E7%AE%A1%E7%90%86.html mysql沒有像 ...

MySQL對字段新增自增序列

現在有這樣的場景,我們的資料庫類型是MySQL,表是從其他庫拿過來的,限制和索引都沒遷移.現在希望增加一個自增序列. 且自增序列是從目前最大自增ID開始的,下面就是這樣一個過程的示範. mysql&g ...

MySQL進階14--辨別列(自增序列/auto_increment)--設定/展示步長--設定/删除标示列

/*進階14 辨別列 又稱為自增序列; 含義 : 可以不用手動的插入值, 系統提供預設的序列值(1-->n) 特點 : 1.辨別列必須和主鍵搭配? 不一定,但要求是一個key 2.一個表可以有幾 ...

MySQL用變量的方法添加僞序号列(自增序列)

在進行資料篩選時,可能會用到給每一條資料配上一個唯一的序号,便于進行定位. 方法: 序号的設定:   @rownum :[email protected] + 1 AS rownum 擷取序号的僞表[必須]:   (S ...

随機推薦

zzz

開放平台(TOP)的API是基于HTTP協定來調用的,開發者(ISV)可以直接使用TOP提供的官方SDK(支援多種語言,包含了請求的封裝,簽名加密,響應解釋,性能優化等)來調用,也可以根據TOP的協定 ...

更新日志 - fir.im 新版優化上線

經過這段時間的使用者回報收集和新版本的功能調研,我們對 fir.im Rio 上傳下載下傳.應用管理再次做了調整優化.感謝之前内測使用者的回報與建議.目前 fir.im Rio 新版已正式上線,主要優化有以下 ...

Android WebView 開發教程

聲明在先:必須在AndroidMainfest.xml 裡面聲明權限,否則在Java裡面編寫的所有WebView浏覽網頁的代碼都無法正常使用

Uva 548 Tree

0.這是一道利用中序周遊和後序周遊确定二叉樹的題目,學會建樹 關鍵點了解這段代碼 int build(int L1,int R1,int L2,int R2) { //printf("bui ...

iOS開發UI篇—transframe屬性(形變)

iOS開發UI篇—transframe屬性(形變) 1. transform屬性 在OC中,通過transform屬性可以修改對象的平移.縮放比例和旋轉角度 常用的建立transform結構體方法分兩 ...

So many interfaces!

http://stackoverflow.com/questions/4817369/why-does-does-it-really-listt-implement-all-these-interfa ...

Android之自定義Adapter的ListView

ListView的建立,一般要具備兩大元素: 1)資料集,即要映射的字元串.圖檔資訊之類. 2)擴充卡,實作把要映射的字元串.圖檔資訊映射成視圖(如Textview.Image等元件),再添加到Lis ...

JAVAEE學習路線分享

今天把我的教學經驗分享給大家.适合大多數人的學習路線.注:目前作者已經轉行做java教育訓練. 首先是培養興趣.先開始學習HTML知識.也就是做網頁,從這裡開始比較簡單,就是幾個标簽單詞需要記住. 接着開 ...

Cocos2d-x 3.2Lua示範樣例UserDefaultTest(使用者預設配置)

Cocos2d-x 3.2示範樣例UserDefaultTest(使用者預設配置) 本篇部落格介紹Cocos2d-x 3.2示範樣例中的UserDefaulstTest,我們在開發中可能須要用到一些預設配 ...

基于VUE選擇上傳圖檔并在頁面顯示(圖檔可删除)

demo例子: 依賴檔案 : http://files.cnblogs.com/files/zhengweijie/jquery.form.rar HTML文本内容: ...