私は、MySQL 5.7で働いている:INSERT ON DUPLICATE KEY UPDATEのトリガ前のMySQL - マニュアルが間違っているようですか?
は、BEFORE INSERTトリガーは、行ごとにアクティブに、続い:
D:\>mysql --version mysql Ver 14.14 Distrib 5.7.17, for Win64 (x86_64)
manualによると、BEFORE INSERTトリガーの動作が可能になっています行の重複キーがあったかどうかによって、 AFTER INSERTトリガー、またはBEFORE UPDATEとAFTER UPDATEの両方のトリガーがトリガーされます( トリガー)。 INSERTおよびUPDATEトリガーは、キーの競合があるのかどうかに依存しているしばらく私はこれを取る
は、BEFORE INSERTは関係なく、重複キーマッチがありますかどうかに実行されることを意味します。 This SOも同じです。しかし、私はこの動作を見ていません。ここに私がしたことがあります:
create table testtable (
id integer primary key auto_increment,
nickname varchar(40), -- this is the natural key to be unique indexed
name varchar(40),
uuid varchar(36)); -- this is what I want to assign in the trigger
alter table testtable add unique index testtable_ux (nickname);
create trigger testtable_uid before insert on testtable for each row set
new.uuid=uuid();
-- get some data
insert into testtable (nickname, name) values ('bob', 'Robert'),
('fred', 'Frederick'), ('cha', 'Chauncey');
select * from testtable;
1 bob Robert 06fb18be-f87e-11e6-8e6f-0060737a7c01
2 fred Frederick 06fb1a5d-f87e-11e6-8e6f-0060737a7c01
3 cha Chauncey 06fb1aec-f87e-11e6-8e6f-0060737a7c01
ニース - それぞれの男はユニークなUUIDを持っています。今すぐマニュアルに従って、このBEFORE INSERTトリガーは、重複キーがあるかどうかに関係なく実行されるはずです。重複キー更新を取得しても、UUIDを更新する必要があります。見てみましょう:
insert into testtable (nickname, name) values ('fred', 'Alfred')
on duplicate key update name='Alfred';
3 88 16:39:32 ... 2 row(s) affected 0.032 sec
select * from testtable;
1 bob Robert 06fb18be-f87e-11e6-8e6f-0060737a7c01
2 fred Alfred 06fb1a5d-f87e-11e6-8e6f-0060737a7c01
3 cha Chauncey 06fb1aec-f87e-11e6-8e6f-0060737a7c01
名前が更新されました。
2 fred Frederick 06fb1a5d-f87e-11e6-8e6f-0060737a7c01
2 fred Alfred 06fb1a5d-f87e-11e6-8e6f-0060737a7c01
upsertは期待通りに実行されましたが、UUIDは再生成されませんでした。私は定数の文字列でこれを試して、同じ結果を得る。
これはまさに私が起こりたいことです。 upsertのどの枝をとっているかにかかわらず起きるBEFORE INSERTは、かなり役に立たないようです。少なくとも、この動作はもっと便利です。しかし、それはマニュアルが言っているものに反するようです。どんな洞察?
私の推測を:新しい 'uuid'が生成されますがありません割り当てられた。なぜそれはすべきだと思いますか?あなたはduplikateキーで何が起こるべきかを正確に伝えます: 'name = 'Alfred''。なぜUUIDが変わると思うのですか? –
@PaulSpiegel考えてくれてありがとう、しかし私はそこに "セット"を持っています。これは、最初の挿入時に機能します。つまり、カラムが最初に挿入される方法です。 – fool4jesus