在MySQL中创建函数时出错

时间:2013-06-01 03:17:56

标签: mysql mysql-workbench

我在创建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的功能。

由于

1 个答案:

答案 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

进行排序