插入触发器后使用另一个 table 的查询结果更新 table

After insert trigger to update a table with query results from another table

此问题与 有关。我有 2 MySQL table,raw_contactsdistilled_contacts。 table结构如下:

raw_contacts
--------------------------------------------
ID (primary auto-increment, int)
PHONE (composite unique with NAME, varchar)
NAME (composite unique with PHONE, varchar)
FREQUENCY (int)
Composite unique key is named PHONENUM

distilled_contacts
---------------------------------------------
ID (primary auto-increment, int)
PHONE (unique, varchar)
POPULARNAME (varchar)

每次在 raw_contacts 中插入一个新行时,我需要在 distilled_contacts[= 中创建一个新条目34=] 用于上下文中的 phone 数字,在 POPULARNAME 字段中更新频率最高的名称。如果在 distilled_contacts 中已经存在该 phone 号码的条目,如果有的话,应该用更改更新它。我能够使用此查询以最高频率检索名称:

select NAME from `raw_contacts` RC1 where PHONE="11111" 
and FREQUENCY>=all (select FREQUENCY from `raw_contacts` RC2 where RC2.PHONE=RC1.PHONE) LIMIT 1

现在如何写触发器把insert/update这个名字和phone号码写成distilled_contacts?这是我的尝试:

CREATE TRIGGER trigger1
AFTER UPDATE
   ON `raw_contacts` FOR EACH ROW
BEGIN
INSERT INTO `distilled_contacts`
(PHONE, POPULARNAME)
select PHONE, NAME from `raw_contacts` RC1 where PHONE="11111" 
and FREQUENCY>=all (select FREQUENCY from `raw_contacts` RC2 where RC2.PHONE=RC1.PHONE) LIMIT 1 ON DUPLICATE KEY UPDATE POPULARNAME = NAME
END;

但我仍然无法理解如何使用变量而不是“11111”来引用上下文中的 phone 数字,即在 下插入的值PHONE raw_contacts.

终于开始工作了:

CREATE TRIGGER trigger1
AFTER UPDATE
   ON `raw_contacts` FOR EACH ROW
BEGIN
INSERT INTO `distilled_contacts`
(PHONE, POPULARNAME)
select PHONE, NAME from `raw_contacts` RC1 where PHONE=NEW.PHONE 
and FREQUENCY>=all (select FREQUENCY from `raw_contacts` RC2 where RC2.PHONE=RC1.PHONE) LIMIT 1 ON DUPLICATE KEY UPDATE POPULARNAME = NAME
END;

但是,我还不会将其标记为已接受,因为我想看看是否有人对进一步优化触发器(或基础查询)有任何建议。此触发器将在每 insert/update 后触发,并且可能会同时发生数千个此类事件。因此,非常感谢任何使它对性能更友好的建议!