2013-06-01 40 views
0

我在創建Function GenerateID時遇到了問題。 功能應該是建立在以下格式的ID:在MySQL中創建函數的錯誤

最後2個位數的年份+的「 - 」 +唯一ID是漸進具有格式「0001」最大隻有那麼它應該看4digits這樣的 - > 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.

謝謝

+0

只能將相關代碼(即僅用於函數) –

+0

該表沒有名爲'generateNumber'的列,該列名爲'Number'。 – Barmar

+0

CAST和CONVERT之間沒有區別。但我會使用'DATE_FORMAT()'而不是其中任何一個。 – Barmar

回答

1

您是否正在尋找?

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

+0

@CrissNautilus你需要更多的幫助來解決你的問題嗎? – peterm