MySQL實現序列效果
一般使用序列(Sequence)來處理主鍵字段,在MySQL中是沒有序列的,但是MySQL有提供了自增長(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'
);
7. 新建表 用於測試的表
DROP
TABLE
IF EXISTS `test1`;
CREATE
TABLE
`test1` (
`
name
`
varchar
(255)
NOT
NULL
,
`value`
double
(255,0)
DEFAULT
NULL
,
`num1`
int
(11)
DEFAULT
NULL
,
`num2`
int
(11)
DEFAULT
NULL
,
PRIMARY
KEY
(`
name
`)
);
8. 新建觸發器 插入新紀錄前給自增字段賦值實現字段自增效果
CREATE
TRIGGER
`TRI_test1_num1` BEFORE
INSERT
ON
`test1`
FOR
EACH ROW
BEGIN
set
NEW.num1 = nextval(
'seq_test1_num1'
);
set
NEW.num2 = nextval(
'seq_test1_num2'
);
END
9. 最后測試自增效果
INSERT
INTO
test1 (
name
, value)
VALUES
(
'1'
,
'111'
);
INSERT
INTO
test1 (
name
, value)
VALUES
(
'2'
,
'222'
);
INSERT
INTO
test1 (
name
, value)
VALUES
(
'3'
,
'333'
);
INSERT
INTO
test1 (
name
, value)
VALUES
(
'4'
,
'444'
);
10. 結果展示
SELECT
*
FROM
test1;
轉載自https://www.2cto.com/database/201508/427101.html