我在创建Function GenerateID时遇到问题。 该函数应该创建一个格式如下的ID:
年份的最后2位数字+' - '+唯一ID,它是格式为'0001'的最大4位数,因此应该看起来像这样 - > 13-0001,13-0002,13-0003等。
所以现在我有这个表和功能 我有唯一的标识符,它是ID的自动增量 虽然我有数字,它将包含'13 -0001'等数字。 基本上我的功能将获得ID并将它们与年份,' - '和'000'结合起来 通过使用concat和cast但它看起来不会起作用,因为我在创建函数时遇到语法错误。
--MYSQL
-- Function
DROP FUNCTION generateNumbers
CREATE FUNCTION generateNumbers (id int)
RETURNS VARCHAR(10)
RETURN CONCAT(substr((cast(CURDATE() as varchar(10))),3,2), '-', right(concat('000000', cast( id as varchar(6) ) ), 6) );
-- Trigger
DROP TRIGGER generateNumber_Insert
DELIMITER ||
CREATE TRIGGER generateNumber_Insert BEFORE INSERT ON ABC
FOR EACH ROW
BEGIN
SET NEW.Number = generateNumbers(abc.ID) ;
END
||
--
DROP TABLE abc;
Create table abc
(
ID int NOT NULL AUTO_INCREMENT PRIMARY KEY,
Number VARCHAR(10),
name varchar(32)
)
我不确定我的语法是什么。而且,使用COnvert()比使用CAST()更好吗?或相反亦然?似乎无法区分2的功能。
由于
答案 0 :(得分:0)
你在找这个吗?
CREATE TABLE abc
(
id int NOT NULL PRIMARY KEY,
number VARCHAR(9) NOT NULL,
name varchar(32)
);
功能
CREATE FUNCTION f_get_number (id INT)
RETURNS VARCHAR(9)
RETURN CONCAT(DATE_FORMAT(CURDATE(), '%y'), '-', LPAD(id, 6, '0'));
现在触发
DELIMITER ||
CREATE TRIGGER tg_abc_insert
BEFORE INSERT ON abc
FOR EACH ROW
BEGIN
DECLARE newid INT DEFAULT 0;
SET newid = (SELECT COALESCE(MAX(id), 0) + 1 FROM abc);
SET NEW.id = newid;
SET NEW.number = f_get_number(newid);
END||
DELIMITER ;
插入几行
INSERT INTO abc(name) VALUES ('name1'),('name2');
输出
+----+-----------+-------+
| id | number | name |
+----+-----------+-------+
| 1 | 13-000001 | name1 |
| 2 | 13-000002 | name2 |
+----+-----------+-------+
注意:在高度并发访问的情况下使用MAX(id)
会出现问题。可以使用附加表来解决它,以便使用auto_increment