2009-11-19 3 views
2

Google 시스템에는 숫자 열의 이점을 얻을 수있는 테이블이 있으므로 작업에 대한 1, 2, 3 번째 레코드를 쉽게 얻을 수 있습니다. 물론 우리는 응용 프로그램 자체에서이 열을 업데이트 할 수 있지만 데이터베이스에서 수행하려고했습니다.MySQL의 트리거 내에서 "주문"열을 업데이트 할 수 있습니까?

마지막 메서드는 결과의 "중간"에 속하는 데이터를 순서에 관계없이 수신 할 수있는 경우를 처리해야합니다. 또한 레코드를 편집하거나 삭제할 수 있으므로 해당 업데이트 및 삭제 트리거가 있습니다.

표 :

CREATE TABLE `test` (
    `id` int(11) unsigned NOT NULL AUTO_INCREMENT, 
    `seq` int(11) unsigned NOT NULL, 
    `job_no` varchar(20) NOT NULL, 
    `date` date NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM AUTO_INCREMENT=7 DEFAULT CHARSET=latin1 

그리고 몇 가지 예를 들어 데이터 :

mysql> SELECT * FROM test ORDER BY job_no, seq; 
+----+-----+--------+------------+ 
| id | seq | job_no | date  | 
+----+-----+--------+------------+ 
| 5 | 1 | 123 | 2009-10-05 | 
| 6 | 2 | 123 | 2009-10-01 | 
| 4 | 1 | 123456 | 2009-11-02 | 
| 3 | 2 | 123456 | 2009-11-10 | 
| 2 | 3 | 123456 | 2009-11-19 | 
+----+-----+--------+------------+ 

내가 조작자의에서 "SEQ"열을 업데이트하는 기대했다, 그러나 이것은으로, MySQL이 허용되지 않습니다 "이 저장 함수/트리거를 호출 한 문에서 이미 사용 되었기 때문에 저장 함수/트리거에서 테이블 'test'를 업데이트 할 수 없습니다."라는 오류가 발생합니다. 나는이 테이블에 각 업데이트 후 함수를 호출 기억이 아닌 다른 후있어 무엇을 달성 할 수있는 방법이

CREATE TRIGGER `test_after_ins_tr` AFTER INSERT ON `test` 
    FOR EACH ROW 
BEGIN 
    SET @seq = 0; 
    UPDATE 
    `test` t 
    SET 
    t.`seq` = @seq := (SELECT @seq + 1) 
    WHERE 
    t.`job_no` = NEW.`job_no` 
    ORDER BY 
    t.`date`; 
END; 

거기에 다음과 같이

내 시험 트리거는 무엇입니까?

답변

1

어떨까요?

세르지의 댓글이 위에서
CREATE TRIGGER `test_after_ins_tr` BEFORE INSERT ON `test` 
    FOR EACH ROW 
BEGIN 
    SET @seq = (SELECT COALESCE(MAX(seq),0) + 1 FROM test t WHERE t.job_no = NEW.job_no); 
    SET NEW.seq = @seq; 
END; 
+0

레코드를 순서없이 삽입하는 경우를 처리하지 못합니다. 요구 사항을 잊어 버렸습니다. 사용자는 순서에 따라 데이터를 수신 할 수 있으므로 날짜 필드로 주문해야하며 레코드를 삭제/업데이트해도 틈이 없는지 확인하십시오! 매우 이상하지만, "시퀀스"필드는 그다지 드문 일이라고 상상할 수 없습니다. – Drarok

+1

그렇다면 MySQL의 제한 사항 (http://dev.mysql.com/doc/refman/5.1/en/stored-program-restrictions.html)에서와 같이 가능한 것은 아는 한 : "저장된 함수 또는 트리거를 사용하면 함수 나 트리거를 호출 한 문에 의해 이미 읽거나 쓰는 테이블을 수정할 수 없습니다. " – Sergi

관련 문제