2017-04-22 7 views
0

データベース内のオファーとリクエストに一致するトリガーを正しく実行しようとしていて、一致する場合は別のテーブルにデータを追加します。これは私のためにかなり複雑になってきて、誰かが私を正しい方向に向けることができます。2つのテーブルのデータをチェックしてから別のテーブルにデータを追加するMySQLのトリガー

CREATE TRIGGER rideMatch 
AFTER INSERT ON rideRequest 
FOR EACH ROW 
BEGIN 
IF EXISTS(
    SELECT * from rideOffer r 
    where r.time = new.time AND 
    r.date = new.date AND 
    r.pickUpLocation = new.pickUpLocation AND 
    r.dropOffLocation = new.dropOffLocation 
    ) 
THEN 
    INSERT INTO Ride(rideDate, pickUpTime, pickUpLocation, dropOffLocation, driver, carName) 
    VALUES(new.date, new.time, new.pickUpLocation, new.dropOffLocation, r.driver, r.carName); 
    END IF; 
+0

あなたは、少なくとも 'END'キーワードが欠落しています。これは、単一のステートメント・トリガーがあるためしかし、あなただけの 'BEGIN'キーワードを削除することができます。 –

+0

このクエリの問題点は何ですか? –

+0

私はより明確にすべきだった。私はまた、元のテーブルからエントリが削除されたときにこれを実行します。また、最後に文法上の誤りがあり、最後の挿入文でrテーブルを参照できるかどうかはわかりません。 –

答えて

0

まず、私はこのタイプのロジックをトリガーに行われるべきであるとは思わない: は、ここで私がこれまで持っているものです。それは、データの整合性ではなく、アプリケーションロジックのようです。ストアドプロシージャは、より適切な場所のようです。あなたが申し出テーブルからデータを取得する必要があり、言わ

CREATE TRIGGER rideMatch 
AFTER INSERT ON rideRequest 
FOR EACH ROW 
BEGIN 
    insert into Ride(rideDate, pickUpTime, pickUpLocation, dropOffLocation, driver, carName) 
    select new.date, new.time, new.pickUpLocation, new.dropOffLocation, 
      r.driver, r.carName 
    from rideOffer r 
    where r.time = new.time AND 
      r.date = new.date AND 
      r.pickUpLocation = new.pickUpLocation AND 
      r.dropOffLocation = new.dropOffLocation 
    limit 1; 
end; 

注:

  • これはrideOfferに一致する任意]を選択します私はこのような何かを考えます。
  • 何も一致しない場合は、何も挿入されません。
  • このロジックは、複数の要求のために使用したのと同じrideOfferが終わる可能性があるため、最低でも、正しくありません。
  • 実際にフィールドの値を入力するのではなく、rideOfferのプライマリキーを使用する必要があります。

つまり、これはあなたの質問に答える必要があります。この質問の範囲外でずっとある欠陥 - しかし、私は、アプリケーションの設計と主要な欠陥があると思います。

関連する問題