2016-09-22 9 views
0

テーブルに新しい行を挿入し、別のテーブルのIDへの参照を含むテキスト列を挿入する必要があります。例: INSERT INTOテーブル1(参照、日付)VALUES('23,24,25 '、' 2016-09-22 ');"in" in insert after insert

トリガーはtable2.statusを更新する必要があります。ここで、table2.idはtable1.referenceの値の1つです。今ではこのようなものです:私はステータス値が最初の行にのみ変更した...

DELIMITER ;; 
CREATE TRIGGER `rim_ai` AFTER INSERT ON `table1` FOR EACH ROW 
UPDATE table2 SET status = 11 WHERE id IN (NEW.reference);; 
DELIMITER ; 

しかし、(例えばID 23との1。)。 トリガで何かが壊れても、何も更新されません! 参照フィールドを 'text'以外のものに変換する必要がありますか? ありがとうございます。

答えて

0

壊れたトリガーではなく、テーブルデザインです。カンマ(または他のセパレータ)で区切られた1つのフィールドに一連の値を格納しないでください。各個別の参照日ペアは、独自のレコードに格納する必要があります。

代わりの

reference | date 
23,24,25 |2016-09-22 

は期待どおりにトリガーが動作します。この例では

reference | date 
23  |2016-09-22 
24  |2016-09-22 
25  |2016-09-22 

を持っています。私は少しwhere句を書き換えるだろうが:

...WHERE id = NEW.reference 

あなたは、技術的にマルチテーブル更新ステートメントとfind_in_set()機能を使用して、現在のデータ構造を持つトリガ作品を作ることができますが、私はそれをお勧めしません。

あなたが経験している行動の原因はid IN (NEW.reference)式がid IN (23,24,25)inオペレータの3つの値のセット)として評価されていないということですが、id IN ('23,24,25')(単一の文字列は、3つの数字を含む)として。 MySQLは暗黙的に'23,24,25'文字列をnumberに変換します。これは数字23になります(23の後のカンマは数字の一部として解釈されないため、MySQLは変換を停止して23を数字として返します)。したがって、id = 23のレコードのみが更新されます。

+0

あなたは明らかに正しいです...私は怠惰に参照テーブルの作成を回避しようとしていました。ありがとうございました。 –

関連する問題