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

时间:2015-05-07 06:35:59

标签: mysql triggers

此问题与previous one有关。我有2个MySQL表, raw_contacts distilled_contacts 。表格结构如下:

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 中为新电话号码创建一个新条目,其中包含更新频率最高的名称在 POPULARNAME 字段中。如果 distilled_contacts 中的该电话号码已存在条目,则应仅使用更改进行更新(如果有)。我可以使用此查询检索频率最高的名称:

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

现在,如何将插入/更新此名称和电话号码的触发器写入 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 列下插入的值 raw_contacts

1 个答案:

答案 0 :(得分:0)

最后,让这个工作:

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;

但是,我还没有将此标记为已接受,因为我想看看是否有人有任何建议可以进一步优化触发器(或基础查询)。每次插入/更新后都会触发此触发器,同时可能会有数千个此类事件。因此,非常感谢任何使这种性能更友好的建议!