1

トリガーに奇妙な問題があります。「profile」という名前のテーブルにデータを挿入したいのですが、「profile_info」という別のテーブルに存在する場合、トリガーが「profile」のいくつかの列を埋めるようにします。「profile_info」に存在しない場合、トリガーはレコードの ID を「profile_info」に追加して、後で入力する必要があります。

CREATE TRIGGER `info_filler` BEFORE INSERT ON `profile`
 FOR EACH ROW begin

select info1, info2, info3, id from
profile_info where id = new.id into @i1, @i2, @i3, @id;
set new.info1 = @i1;
set new.info2 = @i2;
set new.info3 = @i3;
If @id is null THEN
 insert into profile_info (id) values (new.id);
END IF;
end

「プロファイル」にレコードを1つずつ追加して、正しく機能するかどうかを確認すると、トリガーは正常に機能しました。しかし、多くのレコードが同時に追加されると (毎秒 1500 以上)、問題が発生し始めました。プロファイルに追加されたレコードの一部に、info1、info2、info3 列が間違っていました。たとえば、「プロファイル」テーブルには次のような値があります。

| id        |  info1     |  info2     |  info3     |
|-----------|------------|------------|------------|
| 1         |     10     |     23     |     12     |
| 2         |     10     |     23     |     12     |
| 3         |     10     |     23     |     12     |
| 4         |     7      |     42     |     73     |
| 5         |     5      |     45     |     33     |
| 6         |     5      |     45     |     33     |
| 7         |     NULL   |     NULL   |     NULL   |

私の問題は、行 2、3、6 の info1、info2、および info3 の値が間違っていて、それらの値が別の行に属していることです。また、これらの行は「profile_info」には追加されません。1、4、5、7 は問題ありません。7 も「profile_info」に追加されます。

同じ情報を別のテーブルにコピーするべきではありません。私もそれに取り組んでいます。しかし、今のところ、このトリガーが機能する必要があり、何が間違っているのかわかりません。どんな助けでも大歓迎です。

私はmysql 5.5とinnodbを使用しています。挿入は、複数のコンピューターから python によって行われます。

4

1 に答える 1

0

次のように変更するとどうなりますか。

select info1, info2, info3, id from
profile_info where id = new.id into @i1, @i2, @i3, @id;
If @id is null THEN
  insert into profile_info (id) values (new.id);
ELSE
  set new.info1 = @i1;
  set new.info2 = @i2;
  set new.info3 = @i3;
END IF;
于 2012-10-13T11:54:53.700 に答える