我似乎无法在我的代码中发现任何触发错误。 (我通常使用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工作台上做它我应该使用
SET变量
而不是直接
变量:=
期望的结果是外汇:T201600001
// T for transaction,2016我从dateformat得到它,其余的是从数据库中选择最大的数据
它是一个用于生产计划的软件,所以我正在制作交易代码
答案 0 :(得分:0)
此操作实际上不需要临时变量(在Oracle或MySQL中)。我认为以下是相同的逻辑:
$config['global_xss_filtering'] = TRUE;
答案 1 :(得分:0)
NVL
,是为你构建的函数吗?MySQL中不存在Oracle NVL
函数(在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的answer进行简化:
SET NEW.TRANSACTION_ID := CONCAT(...);