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;
거기에 다음과 같이
내 시험 트리거는 무엇입니까?
레코드를 순서없이 삽입하는 경우를 처리하지 못합니다. 요구 사항을 잊어 버렸습니다. 사용자는 순서에 따라 데이터를 수신 할 수 있으므로 날짜 필드로 주문해야하며 레코드를 삭제/업데이트해도 틈이 없는지 확인하십시오! 매우 이상하지만, "시퀀스"필드는 그다지 드문 일이라고 상상할 수 없습니다. – Drarok
그렇다면 MySQL의 제한 사항 (http://dev.mysql.com/doc/refman/5.1/en/stored-program-restrictions.html)에서와 같이 가능한 것은 아는 한 : "저장된 함수 또는 트리거를 사용하면 함수 나 트리거를 호출 한 문에 의해 이미 읽거나 쓰는 테이블을 수정할 수 없습니다. " – Sergi