1

だから私の問題は次のとおりです。列が NULLであるかどうかに応じて、ステートメントに「保留中」または「決して」というtimeStatus2 つの値のいずれかを持つ列があります。INSERTfromDate

私はこの準備済みのステートメントを作成しましたが、これは機能しませんが、意図したことを表しています。一方、ステートメントで指定するのではなく、ここで制約が適切かどうかはわかりません。このようにして、挿入または更新のステータス値を指定でき、テーブルは何をすべきかを知ることができます。ただし、どの方法を使用するか、どこで学習するかについてのガイダンスが必要です。

声明は次のとおりです。

INSERT INTO Bservices (
  servStatus, timeStatus,
  fromDetails, fromDate, fromTime) 
VALUES(
  'pending', IF(ISNULL(`fromDate`)) 'pending' ELSE 'never', 
  'a', '', '')

意図した動作は次のとおりです。

ON INSERT
if(fromDate == '') { 
  timeStatus = 'pending' 
} else { 
  timeStatus = 'never' 
}

ON UPDATE
if(timeStatus == 'pending' && fromDate != '') { 
  timeStatus = 'updated'
}
4

1 に答える 1

1

行が作成される前に式が評価されるため、INSERT ステートメントの VALUES 句で式を使用する場合、これは機能しません。したがって、すべての列は当然 NULL です。

必要なことを行うには、BEFORE INSERT および BEFORE UPDATE トリガーを記述する必要があります。次のようなものですが、これをテストしていないため、デバッグはあなたに任せます。

CREATE TRIGGER insBservices
BEFORE INSERT ON Bservices 
FOR EACH ROW
  SET NEW.timeStatus = IF(NEW.fromDate IS NULL, 'pending', 'never');

CREATE TRIGGER updBservices
BEFORE UPDATE ON Bservices
FOR EACH ROW
  SET NEW.timeStatus = IF(NEW.fromDate IS NOT NULL AND OLD.timeStatus = 'pending', 
      'updated', NEW.timeStatus);

あなたのコメントについて:

トリガーについて詳しく知りたい場合、MySQL のマニュアルは実際にはこの分野ではかなり不十分です。参考のために構文を示しますが、多くの例はありません。ややこしい部分が多いです。

たとえば、DELIMITERトリガーを定義するときにいつ使用するかを理解して、トリガーの本体内のセミコロンとCREATE TRIGGERステートメント自体のターミネーターの間のあいまいさを説明します。CREATE PROCEDUREこれはとにも当てはまりCREATE FUNCTIONます。

Create function through MySQLdbへの回答に例と説明を書きました。

たとえば、トリガーに関するチュートリアルがあります。

于 2014-04-25T16:53:03.090 に答える