mysql實現nextVal功能

愛笑的貓發表於2019-01-19

mysql實現nextVal功能

首先建立表:

CREATE TABLE `sys_sequence` (
   `NAME` varchar(50) NOT NULL,
   `CURRENT_VALUE` int(11) NOT NULL DEFAULT `0`,
   `INCREMENT` int(11) NOT NULL DEFAULT `1`,
   PRIMARY KEY (`NAME`)
 )

插入記錄
INSERT INTO SYS_SEQUENCE(NAME,CURRENT_VALUE,INCREMENT) VALUES(`TBL_FS`, 1,1)

DELIMITER $$
DROP FUNCTION IF EXISTS `currval`$$
CREATE DEFINER=`root`@`%` FUNCTION `currval`(seq_name VARCHAR(50)) RETURNS INT(11)
BEGIN
DECLARE VALUE INTEGER;
SET VALUE=0;
SELECT current_value INTO VALUE
FROM sys_sequence 
WHERE NAME=seq_name;
RETURN VALUE;
END$$
DELIMITER ;

查詢當前記錄:
select currval(`TBL_FS`);
如果出現Error Code: 1449 The user specified as a definer (`root`@`%`) does not exist 錯誤,則執行如下sql:
grant all privileges on . to root@”%” identified by “password”;
flush privileges;

繼續執行當前記錄sql則成功
建立nextval函式

DELIMITER $$
DROP FUNCTION IF EXISTS `nextval`$$
 
CREATE DEFINER=`root`@`%` FUNCTION `nextval`(seq_name varchar(50)) RETURNS int(11)
BEGIN
UPDATE sys_sequence
SET CURRENT_VALUE = CURRENT_VALUE + INCREMENT
where name=seq_name;
return currval(seq_name);
END$$
DELIMITER ;

執行nextval函式
select nextval(`tbl_fs`)

建立函式過程中出現This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its de 錯誤

這是我們開啟了bin-log, 我們就必須指定我們的函式是否是
1 DETERMINISTIC 不確定的
2 NO SQL 沒有SQl語句,當然也不會修改資料
3 READS SQL DATA 只是讀取資料,當然也不會修改資料
4 MODIFIES SQL DATA 要修改資料
5 CONTAINS SQL 包含了SQL語句

其中在function裡面,只有 DETERMINISTIC, NO SQL 和 READS SQL DATA 被支援。如果我們開啟了 bin-log, 我們就必須為我們的function指定一個引數。

在MySQL中建立函式時出現這種錯誤的解決方法:
set global log_bin_trust_function_creators=TRUE;

相關文章