、MySQLは参照列が変更されるように指定されている場合にのみ生成され記憶された列を再評価します(注:必ずしもがちょうど変更する列のリストで、変更)。たとえば、これを確認できます。デバッグビルドを使用します。
create table test (
id int auto_increment primary key,
x int,
y int,
gencolx int as (2*x) stored,
gencolconst int as (2) stored
);
insert into test (x, y) values (2, 2);
update test set x = 4;
update test set y = 5;
update test set x = 4;
最初update
がx
に依存する生成列gencolx
の評価をトリガーする:
THD::decide_logging_format: info: query: update test set x = 4
update_generated_read_fields: info: field 'gencolx' - skipped
update_generated_read_fields: info: field 'gencolconst' - skipped
update_generated_write_fields: info: field 'gencolx' - updated
update_generated_write_fields: info: field 'gencolconst' - skipped
第update
は、任意の生成された列に使用される列を更新し、従って彼らありません再計算されません:
THD::decide_logging_format: info: query: update test set y = 5
update_generated_read_fields: info: field 'gencolx' - skipped
update_generated_read_fields: info: field 'gencolconst' - skipped
update_generated_write_fields: info: field 'gencolx' - skipped
update_generated_write_fields: info: field 'gencolconst' - skipped
残念ながら、MySQLは値が実際に変更されました。その列が宛先列である場合のみです。
THD::decide_logging_format: info: query: update test set x = 4
update_generated_read_fields: info: field 'gencolx' - skipped
update_generated_read_fields: info: field 'gencolconst' - skipped
update_generated_write_fields: info: field 'gencolx' - updated
update_generated_write_fields: info: field 'gencolconst' - skipped
mysql_update: info: 0 records updated
同じ:列x
はupdate
文で変更する列であるため、だから、最後update
は、実際には変わらないx
の値を残していること、まだ、依存生成された列の評価になりますあなたが使用すると、途中で起こります。 update test set x = x
、行を変更しません。
update_generated_read_fields
およびupdate_generated_write_fields
は、生成されたフィールドの式を評価する関連する関数です。 gencolconst
の定数式が更新で評価されないこともわかります。
残念なことに(そしてちょっとしたメモとして)、そのテーブルにトリガーが存在すると、update_generated_write_fields
が2回呼び出され、最初に更新された場合は2番目の生成された列が評価されますそれが問題なのかどうかは関係ありませんinsert
トリガーとupdate
を実行している場合、トリガーの純粋な存在で十分です。
私は十分にクリアなので、私は正しい答えを受け入れました。ありがとう! – Delmo