2016-04-26 10 views
0

だから私は、これらのテーブルを持っている:データベーストリガー挿入前と計算は

CREATE TABLE `chittytransactions` (
    `ChittyTransactionID` int(11) NOT NULL, 
    `AuctionID` int(11) NOT NULL, 
    `ChittyAccNo` int(11) DEFAULT NULL, 
    `Date` datetime DEFAULT NULL, 
    `Amount` double DEFAULT NULL, 
    `Description` varchar(50) DEFAULT NULL, 
    `TransRefence` varchar(50) DEFAULT NULL COMMENT 'Reference from actual Bank transaction', 
    `TransStatus` tinyint(1) DEFAULT NULL COMMENT 'If Transaction Pending or Cleared', 
    `ClearanceDate` datetime DEFAULT NULL, 
    `PaymentMethod` int(1) DEFAULT NULL COMMENT '0- Cash, 1- bank transfer, 2- personal credit etc' 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

CREATE TABLE `chittyusers` (
    `ChittyAccNo` int(11) NOT NULL, 
    `UserId` int(11) NOT NULL, 
    `ChittyID` int(11) NOT NULL, 
    `LatePaymentFee` int(11) DEFAULT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

CREATE TABLE `users` (
    `UserId` int(11) NOT NULL, 
    `UserName` varchar(45) NOT NULL, 
    `UserNameVerified` tinyint(1) DEFAULT '0', 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

何Imは、取引日がchittytransactionテーブルでクリア日と同じであるかどうかをチェックされてやろうと後期を追加しない場合お支払い手数料はchittyusersテーブルになります(日付に基づいて延滞に追加料金が加算されます)。これは前に挿入する必要がありますし、私はトリガを使用しています。これまで私はこれを持っています:

ROP TRIGGER IF EXISTS chitty_beforet_trig; 

DELIMITER ;; 
CREATE TRIGGER chitty_beforet_trig BEFORE Insert ON chittytransaction 
FOR EACH ROW 
    BEGIN 
    DECLARE `mainDate` datetime; 
    DECLARE `claredDate` datetime; 
    DECLARE `chitAccNo` INT(11); 
    DECLARE `userId` INT(11); 
    DECLARE `latePay` DOUBLE; 
    DECLARE late TINYINT; 
    DECLARE cursor1 CURSOR FOR SELECT ChittyAccNo FROM accounting.`chittyusers`; 
    DECLARE cursor2 CURSOR FOR SELECT `Date` FROM accounting.`chittyTransaction`; 
    DECLARE cursor3 CURSOR FOR SELECT ClearanceDate FROM accounting.`chittyTransaction`; 
    DECLARE cursor4 CURSOR FOR SELECT UserId FROM accounting.`users`; 

    OPEN cursor1; 
    OPEN cursor2; 
    OPEN cursor3; 
    OPEN cursor4; 

    FETCH cursor1 INTO chitAccNo; 
    FETCH cursor2 INTO mainDate 
    FETCH cursor3 INTO claredDate; 
    FETCH cursor3 INTO userId; 
    CASE 
     WHEN claredDated <> mainDate THEN 
      SET late ='1'; 
     ELSE 
      SET late = '0'; 
     END; 
    END CASE; 

    IF late THEN 
     UPDATE `chittyusers` SET LatePaymentFee = 50 WHERE UserId = userId; 
    END IF; 
CLOSE cursor1; 
CLOSE cursor2; 
CLOSE cursor3; 
CLOSE cursor4; 

END;; 
DELIMITER; 

私はそれが正しいかどうかはわかりません。これほど少し前にこれらを使用しないでください。誰かが私が間違ってやっていることを教えてもらえますか?

答えて

1

どこから始めるの?

まず、行トリガーは、それが接続されているテーブルを照会するべきではありません。 (MySQLは、これを可能にする、多くのDBMSはないであろう。)

INSERT行トリガーは、常に基礎となる表と同じ列が含まNEW pseudorecordを介して挿入された行へのアクセスを有します。 NEWの内容はINSERT文のVALUES句から初期化され、挿入が完了するとNEWにあなたが加えた変更は、表の行に反映されます。

もう一つの問題は、chittyusers上のカーソルがテーブルからすべての行、あなたが望んでいないだけでものをつかむだろう無条件SELECTを、持っていることです。あなたが実際にやっていることは、おそらくあなたが望むものとは何の関係もないuserIdのほぼ無作為な値をつかむことです。実際には、カーソルを使用する必要はありません。 WHERE句が良い仕事しますと、単純なINSERT ... INTO

SELECT `UserId` 
    INTO `userId` 
    FROM chittyusers 
    WHERE ChittyAccNo = NEW.ChittyAccNo; 

第三に、あなたのケースの構造が不必要です。私はあなたのために全体のトリガを書くことを約ないんだけど、これらのポインタは、少なくとも管理可能な数までのエラーメッセージを取得する必要があります

IF NEW.ClearanceDate <> NEW.`Date` THEN 
    UPDATE `chittyusers` 
    SET LatePaymentFee = 50 
    WHERE UserId = userId; 
END IF; 

:あなたは、IFシンプルとまったく同じことを行うことができます。

+0

ありがとうございます。あなたに感謝しています。ケースを使用することにはなぜ問題がありますか? – luffy

+0

問題はありません。それだけでは必要ありません。それをスクラップすると、変数、コード行、複雑さが減ります。 –

+0

私はそれを間違って使用していますか?はいの場合はどうすれば変更できますか? – luffy

関連する問題