2017-07-26 11 views
0

selectサブクエリで実行されている挿入クエリがあります。これは、基本的に、それが見つけて挿入する行のコピーをフォークオフする必要があります。この部分は機能しますが、ガベージコレクションはありません。私はこれをデータベースイベントで実行しているので、基準に基づいてレコードを見つけて、新しいレコードとしてフォークします。これをもう一度実行します。どのようなアイデアであれ、それが見つけた記録は、おそらく更新されるか、サイクルを止める方法になります。あなたは左を行うことができmysqlの挿入で更新を使用する

INSERT INTO charity (pid, itemname, newval) 
SELECT cha.pid, cha.itemname, 'ref') 
FROM charity AS cha, entry AS ent 
WHERE cha.pid = ent.id 
AND cha.status = 'Pending' 
AND cha.type = 'CHAR' 
AND ent.dates < CURDATE() 
AND ent.total > (SELECT sum(price) FROM charity WHERE cha.type = 'CHAR') 

答えて

0

はフォークレコードを一致させるためのテーブルに対して結合し、すでにフォーク、それらを除外します。

INSERT INTO charity (pid, itemname, newval) 
SELECT cha.pid, cha.itemname, 'ref') 
FROM charity AS cha, entry AS ent 
left outer join charity as cha2 
    on cha2.pid=cha.pid and cha2.itemname = cha.itemname and 
     cha2.newval='ref' 
WHERE cha.pid = ent.id 
AND cha.status = 'Pending' 
AND cha.type = 'CHAR' 
AND ent.dates < CURDATE() 
AND ent.total > (SELECT sum(price) FROM charity WHERE cha.type = 'CHAR') 
AND cha2.pid IS NULL 

警告 - テストされていません。すでに作成されている可能性のあるレコードを適切に指定するための情報が不十分です。

さらに、join on句にテストを追加する必要があります。基本的には、関連付けられた新しいレコードがまだ作成されていないレコードを探します。この場合は、newval = 'ref'のrefordで、他の2つのフィールドが一致します。

+0

私はNOT EXISTSを追加したところで試しましたが、INSERTはまだnewvalにrefカラムを挿入していますが、pidの場合は を探し、refidのnewvalを持つレコードがあればそれを挿入します。しかし、それは、CHA ASチャリティーFROM )チャリティ(PID、itemNameに、たnewval) SELECT cha.pid、cha.itemname、 'REF' へ(EXISTSはありませんが、WHEREチャリティーFROMたnewval SELECT ENT ASエントリを INSERTを間違っていましたたnewval = 'REF') AND cha.pid = ent.id AND cha.status = '保留' AND cha.type = 'CHAR' AND ent.dates (SELECT – hermes

+0

私はあなたのサブクエリが十分に明白だとは思わない - それは他のフィールドに関係なくnewval = 'ref'のどこでもレコードを出力する。 – RichGoldMD

関連する問題