mysql触发器功能

时间:2012-06-18 20:19:06

标签: mysql function triggers datatrigger

我有一个表调用lp_upload,它包含汽车的车牌号和其他相关信息:

CREATE TABLE `lp_upload` (
`date`  date NULL ,
`plate`  char(10) NULL ,
`site`  int NULL ,
`dateid`  char(20) NULL 
)
;

此表从交通摄像头获取信息。然而,有时候盘子中的字母不被识别,它将被$替换。因此,如果一个盘子真的是abc123,但是相机没有识别出c和1,那么它将进入表格中。

我想假设这样做,当一个新的盘子进入并且它的6个字母与现有的盘子匹配时,它将成为那个盘子。 EX:123已输入$ 5678且已存在12345678,然后123 $ 5678将被12345678替换。

所以我先写了一个匹配函数:

CREATE DEFINER = CURRENT_USER FUNCTION `matchingfun`(`str1` char(10),`str2` char(10))
 RETURNS int

 BEGIN

    DECLARE myindex int DEFAULT 0;
  DECLARE count int DEFAULT 0;
  DECLARE maxlength int;

  SET maxlength = length(str1);
  for_loop: LOOP
    SET myindex = myindex + 1;

    IF maxlength < myindex then 
            RETURN 0;
    END IF;

    IF SUBSTRING(str1,myindex,1)= SUBSTRING(str2,myindex,1)then 
            SET count = count +1;
    END IF;

    IF count > 6 then 
            RETURN 1;
    END IF;

    IF SUBSTRING(str1,myindex,1)!= SUBSTRING(str2,myindex,1) and SUBSTRING(str1,myindex,1)!= '$' and SUBSTRING(str2,myindex,1)!= '$'then 
            RETRUN 0; 
    END IF;

  END LOOP for_loop;
    RETURN 0;
END

我在表格中添加了一个触发器功能

CREATE TRIGGER `trigger1` AFTER INSERT ON `lpr_opt_upload`
BEGIN

     declare old_site_id int;
     declare old_text char(10);

     select lpr_text into old_text from lpr_opt_upload where matchingfun(new.lpr_text, lpr_text) = 1;
     if(old_text is not null) then
     set new.lpr_text = old_text;
     end if;

END

当我运行它时,数据库崩溃。你可以帮助解决这个问题或建议一个更好的方法来做到这一点。谢谢。

1 个答案:

答案 0 :(得分:4)

我怀疑你遇到的问题是多次匹配。例如,如果您在数据库中有abcd01234abcde1234并尝试插入abcd$1234,则会收到错误。

现在,我将假设此应用程序应该与速度相机或红灯相机的OCR牌照相匹配,以便于车主的票务。如果是这种情况,那么你想要谨慎一点,不要让系统自动尝试从多个候选人中挑选,而是让人们真实地看一下结果并确认板号。

所以,按照这个假设进行操作:

DELIMITER //
CREATE TRIGGER `attempt_match_existing_plate`
  BEFORE INSERT
  ON `lp_upload`
FOR EACH ROW BEGIN
  DECLARE exist_plate CHAR(10);
  DECLARE rowcount INT;
  SELECT COUNT(*), plate INTO rowcount, exist_plate FROM lp_upload WHERE platematch(NEW.plate, plate) = 1;
  IF (1 = rowcount) AND (exist_plate IS NOT NULL) THEN
    SET NEW.plate = exist_plate;
  END IF;
END
//
DELIMITER ;

DELIMITER //
CREATE DEFINER = CURRENT_USER
  FUNCTION `platematch`(`plate_new` char(10), `plate_exist` char(10))
  RETURNS INT
BEGIN
   DECLARE myindex INT DEFAULT 0;
   DECLARE match_count INT DEFAULT 0;
   DECLARE maxlength INT;
   SET maxlength = length(plate_new);
   for_loop: LOOP
      SET myindex = myindex + 1;
      IF maxlength < myindex THEN 
         RETURN 0;
      END IF;
      IF SUBSTRING(plate_new, myindex, 1) = SUBSTRING(plate_exist, myindex, 1)
      THEN 
         SET match_count = match_count +1;
      END IF;
      IF match_count >= 6 THEN 
         RETURN 1;
      END IF;
      IF  SUBSTRING(plate_new, myindex, 1) != SUBSTRING(plate_exist, myindex, 1)
      AND SUBSTRING(plate_new, myindex, 1) != '$'
      AND SUBSTRING(plate_exist, myindex, 1) != '$'
      THEN
         RETURN 0; 
      END IF;
   END LOOP for_loop;
   RETURN 0;
END
//

DELIMITER ;

在上面描述的场景中,abcd$1234将按原样插入到数据库中,而不是仅自动匹配多个潜在结果中的一个。