我的触发器插入了许多记录

时间:2015-05-14 22:54:05

标签: mysql sql triggers

我有以下触发器:

    begin
 insert into user_has_competence (user_id,competence_id)
 select u.id,c.id from competence c
 join user u on u.organization_id = c.organization_id and c.organization_id = new.organization_id;
end

所涉及的表格如下:

    Table: competence
Columns:
id  int(11) AI PK
name    varchar(400)
organization_id int(11)
competence_type_id  int(11)
competence_category_id  int(11)


Table: user
Columns:
id  int(11) AI PK
username    varchar(100)
password    varchar(100)
is_active   int(11)
user_type_id    int(11)
token   varchar(445)
organization_id int(11)
title_id    int(11)
image_path  varchar(100)
division_id int(11)

    Table: user_has_competence
Columns:
user_id int(11) PK
competence_id   int(11) PK
competence_level_id int(11)
progression varchar(45)
id  int(11) AI PK

现在我有8个用户,当我插入64 competence时,我最终将超过30k行插入user_has_competence

有人能告诉我为什么会这样吗?

更准确地说,它会插入626433行。

2 个答案:

答案 0 :(得分:1)

看起来用户每个组织只能拥有一个权限?如果是这样,我建议在user_id, competence_id, organisation_id in user_has_competence表上使用复合PK。 (你需要在那里添加organisation_id)。然后,当触发器尝试插入重复值时,您会看到错误

编辑:问题的一部分可能是你的触发器不包括你刚插入的新能力_id的where子句,所以它会为所有现有的用户能力关系添加重复

答案 1 :(得分:0)

无论如何......一个猜测......

插入到user_has_competence时会触发,当插入一行时,会在同一个表中插入并插入更多行,从而触发该触发器的另一个实例。而且这种情况一直持续下去。直到你的空间不足。 (这可以解释为什么你看到了30k行然后626k行;现在更多了吗?)

由于user_has_competence上的主键是自动增量,因此不会阻止您插入重复的行......