MYSQL触发错误(很多功能)
MYSQL trigger error (lots of function)
我似乎无法在我的代码中发现任何触发触发器的错误。 (我通常使用 oracle 进行编码,但我在这个项目中转换为我的 sql,检查了所有函数并转换那些在 mysql 中不可用的函数)
这是代码:
CREATE TRIGGER `transaction_before_insert` BEFORE INSERT ON `transaction` FOR EACH ROW BEGIN
DECLARE TEMPKODE VARCHAR(12);
DECLARE TEMP VARCHAR(5);
TEMP:= CONCAT('T',DATE_FORMAT(NOW(),'%Y'));
SELECT CONCAT(TEMP, LPAD(NVL(MAX(CAST(SUBSTR(TRANSACTION_ID,5,5) AS UNSIGNED))+1,1),5,0))
FROM TRANSACTION INTO TEMPKODE
WHERE SUBSTR(TRANSACTION_ID,1,4) = TEMP;
NEW.TRANSACTION_ID := TEMPKODE;
END
编辑 1:
我是从 heidisql 编码的,如果有任何代码差异,因为我听说如果我在 mysql 工作台上进行编码,我应该使用
设置变量
而不是直接
变量 :=
期望的结果是外汇:T201600001
//T代表交易,2016年我从dateformat中获取,剩下的就是从数据库中选择最大的数据
这是一个生产计划软件,所以我正在制作交易代码
您确实不需要此操作的临时变量(在 Oracle 或 MySQL 中)。我认为以下是相同的逻辑:
BEGIN
select new.transactionid := CONCAT('T', YEAR(now()),
LPAD(COALESCE(MAX(SUBSTR(TRANSACTION_ID, 5, 5) + 1
), 1
), 5, 0)
from transaction t
where TRANSACTION_ID LIKE CONCAT(YEAR(now()), '%')
END;
NVL
, is a function built for you?, Oracle NVL
函数在 MySQL 中不存在(在 MySQL 中找到它的等价物),参见 IFNULL
.
DELIMITER $$
BEGIN
DECLARE TEMPKODE VARCHAR(12);
DECLARE TEMP VARCHAR(5) DEFAULT CONCAT('T',DATE_FORMAT(NOW(),'%Y'));
-- OR: SET TEMP := CONCAT('T',DATE_FORMAT(NOW(),'%Y'));
-- TEMP := CONCAT('T',DATE_FORMAT(NOW(),'%Y'));
/*
SELECT CONCAT(TEMP,LPAD(NVL(MAX(CAST(SUBSTR(TRANSACTION_ID,5,5) AS UNSIGNED))+1,1),5,0))
FROM TRANSACTION INTO TEMPKODE
WHERE SUBSTR(TRANSACTION_ID,1,4) = TEMP;
*/
SELECT CONCAT(TEMP,LPAD(COALESCE(MAX(CAST(SUBSTR(TRANSACTION_ID,5,5) AS UNSIGNED))+1,1),5,0))
FROM TRANSACTION
WHERE SUBSTR(TRANSACTION_ID,1,4) = TEMP INTO TEMPKODE;
-- NEW.TRANSACTION_ID := TEMPKODE;
SET NEW.TRANSACTION_ID := TEMPKODE;
END$$
DELIMITER ;
更新
您可以使用@GordonLinoff 的 进行简化:
SET NEW.TRANSACTION_ID := CONCAT(...);
我似乎无法在我的代码中发现任何触发触发器的错误。 (我通常使用 oracle 进行编码,但我在这个项目中转换为我的 sql,检查了所有函数并转换那些在 mysql 中不可用的函数)
这是代码:
CREATE TRIGGER `transaction_before_insert` BEFORE INSERT ON `transaction` FOR EACH ROW BEGIN
DECLARE TEMPKODE VARCHAR(12);
DECLARE TEMP VARCHAR(5);
TEMP:= CONCAT('T',DATE_FORMAT(NOW(),'%Y'));
SELECT CONCAT(TEMP, LPAD(NVL(MAX(CAST(SUBSTR(TRANSACTION_ID,5,5) AS UNSIGNED))+1,1),5,0))
FROM TRANSACTION INTO TEMPKODE
WHERE SUBSTR(TRANSACTION_ID,1,4) = TEMP;
NEW.TRANSACTION_ID := TEMPKODE;
END
编辑 1:
我是从 heidisql 编码的,如果有任何代码差异,因为我听说如果我在 mysql 工作台上进行编码,我应该使用
设置变量
而不是直接
变量 :=
期望的结果是外汇:T201600001
//T代表交易,2016年我从dateformat中获取,剩下的就是从数据库中选择最大的数据
这是一个生产计划软件,所以我正在制作交易代码
您确实不需要此操作的临时变量(在 Oracle 或 MySQL 中)。我认为以下是相同的逻辑:
BEGIN
select new.transactionid := CONCAT('T', YEAR(now()),
LPAD(COALESCE(MAX(SUBSTR(TRANSACTION_ID, 5, 5) + 1
), 1
), 5, 0)
from transaction t
where TRANSACTION_ID LIKE CONCAT(YEAR(now()), '%')
END;
NVL
, is a function built for you?, Oracle NVL
函数在 MySQL 中不存在(在 MySQL 中找到它的等价物),参见 IFNULL
.
DELIMITER $$
BEGIN
DECLARE TEMPKODE VARCHAR(12);
DECLARE TEMP VARCHAR(5) DEFAULT CONCAT('T',DATE_FORMAT(NOW(),'%Y'));
-- OR: SET TEMP := CONCAT('T',DATE_FORMAT(NOW(),'%Y'));
-- TEMP := CONCAT('T',DATE_FORMAT(NOW(),'%Y'));
/*
SELECT CONCAT(TEMP,LPAD(NVL(MAX(CAST(SUBSTR(TRANSACTION_ID,5,5) AS UNSIGNED))+1,1),5,0))
FROM TRANSACTION INTO TEMPKODE
WHERE SUBSTR(TRANSACTION_ID,1,4) = TEMP;
*/
SELECT CONCAT(TEMP,LPAD(COALESCE(MAX(CAST(SUBSTR(TRANSACTION_ID,5,5) AS UNSIGNED))+1,1),5,0))
FROM TRANSACTION
WHERE SUBSTR(TRANSACTION_ID,1,4) = TEMP INTO TEMPKODE;
-- NEW.TRANSACTION_ID := TEMPKODE;
SET NEW.TRANSACTION_ID := TEMPKODE;
END$$
DELIMITER ;
更新
您可以使用@GordonLinoff 的
SET NEW.TRANSACTION_ID := CONCAT(...);