2013-06-01 4 views
0

함수 GenerateID를 만드는 데 문제가 있습니다. 이 함수는 다음 형식의 ID를 생성해야합니다.MySQL에서 함수 생성 중 오류가 발생했습니다.

연도의 마지막 두 자리 + '-'+ 형식이 '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) 
) 

내 구문이 무엇인지 잘 모르겠습니다. 또한 CAST()보다 COnvert()를 사용하는 것이 좋습니다. 혹은 그 반대로도? 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)을 사용하는 것이 문제가됩니다. 시퀀스에 대한 추가 테이블을 사용하여 해결할 수 있습니다.

+0

@CrissNautilus 질문에 대한 도움이 필요합니까? – peterm

관련 문제