0

我在创建函数 GenerateID 时遇到问题。该函数应该创建一个格式如下的 ID:

年份的最后 2 位数字 + '-' + 增量唯一 ID,格式为 '0001' 最多只有 4 位数字,所以它应该看起来像这样 --> 13-0001、13-0002、13-0003 等。

所以现在我有了这个表和函数,我有唯一标识符,它是自动递增的 ID,而我有包含“13-0001”等数字的数字。基本上,我的函数将获取 ID 并通过使用 concat 和 cast 将它们与年份、“-”和“000”结合起来,但它看起来不起作用,因为我在创建函数时遇到语法错误。

--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的功能。

谢谢

4

1 回答 1

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

于 2013-06-01T05:04:08.837 回答