Mysql触发器来插入记录或更新计数(如果它已经存在)?

时间:2017-08-24 02:19:45

标签: mysql triggers

我有2张桌子 第一个表word_cloud(auto inc),predefined_text,content_id。 第二个表word_cloud_count(auto inc),predefined_text,content_id,count。 我将数据插入到word_cloud时调用触发器,它基本上对单词进行分组,计算计数并将其插入到word_cloud_count

word_cloud表由

组成
id | predefined_text | content_id
---------------------------------
 1 | ABC             | 1
 2 | ABC             | 1
 3 | ABC             | 1
 4 | XYZ             | 2
 5 | XYZ             | 2
 6 | XYZ             | 2
 7 | XYZ             | 1
 8 | ABC             | 2
 9 | ABC             | 2
10 | ABC             | 2

word_cloud_count由

组成
id | predefined_text | content_id | count
-----------------------------------------------
 1 | ABC             | 1          |  3
 2 | XYZ             | 2          |  3
 3 | ABC             | 2          |  3
 4 | XYZ             | 1          |  1
 5 | ABC             | 1          |  3
 6 | XYZ             | 2          |  3
 7 | ABC             | 2          |  3
 8 | XYZ             | 1          |  1

在上表中,word_cloud_count行号5,6,7,8是重复数据,

触发功能

CREATE TRIGGER word_cloud_count_insert after insert on word_cloud
    INSERT INTO word_cloud_count (Word,content_id ,count )
    SELECT predefined_text,content_id, count(*)
    FROM word_cloud
    group by predefined_text,content_id

一切正常,值将被插入word_cloud_count表

但是我的问题是每次将数据插入到word_cloud中时都会调用触发器并将重复值存储到word_cloud_count

如何避免这种情况,并在word_cloud

中插入新记录时仅更新计数器

任何建议都会有很大帮助,提前致谢

1 个答案:

答案 0 :(得分:0)

为什么不使用同一张桌子?看一看:

创建包含所有这些列的表:

create table word_cloud
(
    id int not null primary key auto_increment,
    predefined_text varchar(200),
    content_id int,
    `count` int default 1, 
    unique (predefined_text,content_id)  -- important
);

当你运行一个插入语句时,添加额外的句子on duplicate

INSERT INTO word_cloud (predefined_text,content_id) VALUES ('XYZ',1)
  ON DUPLICATE KEY UPDATE `count` = `count` + 1;

INSERT INTO word_cloud (predefined_text,content_id) VALUES ('ABC',1)
  ON DUPLICATE KEY UPDATE `count` = `count` + 1;

INSERT INTO word_cloud (predefined_text,content_id) VALUES ('XYZ',2)
  ON DUPLICATE KEY UPDATE `count` = `count` + 1;

随机执行后插入有时会得到:

mysql> select * from word_cloud;
+----+-----------------+------------+-------+
| id | predefined_text | content_id | count |
+----+-----------------+------------+-------+
|  1 | XYZ             |          1 |     2 |
|  3 | ABC             |          1 |     7 |
| 10 | XYZ             |          2 |     1 |       
+----+-----------------+------------+-------+