插入触发器后使用另一个 table 的查询结果更新 table
After insert trigger to update a table with query results from another table
此问题与 有关。我有 2 MySQL table,raw_contacts 和 distilled_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 后触发,并且可能会同时发生数千个此类事件。因此,非常感谢任何使它对性能更友好的建议!
此问题与
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 后触发,并且可能会同时发生数千个此类事件。因此,非常感谢任何使它对性能更友好的建议!