2

一見すると、私のユースケースは非常に単純です。私は2つのテーブルを持っています:orderline。とをorder含みid、テーブル内にへの参照があります。残念ながら、これは非常に古いシステムであり、更新/削除トリガーで外部キーを使用することはできません(つまり、システムを変更することはできません)。datetimelineidorder

私はこの質問を読んでいて、同様のことをするために自分の質問を書きました。基本的に、注文が2年以上経過している場合は常に、注文が削除されlineたときに関連付けられているすべてのを削除したいと思います。order

DELETE a
FROM 
  `line` AS a
  LEFT JOIN `order` AS b ON a.`order_id` = b.`id`
WHERE
  b.`datetime` < DATE_SUB(NOW(), INTERVAL 2 YEAR);

現在、何も起きていません。影響を受ける行はありません。同じjoinとwhere句を使用して、クエリを単にselectに変更すると、多くの結果が正常に返されます。

ここで何が欠けていますか?

4

4 に答える 4

2

Docはtbl_name、ではなく、と言いtable_referencesます。したがって、これは機能する可能性があります。

DELETE line
FROM 
  line
  LEFT JOIN `order` AS b ON line.`order_id` = b.`id`
WHERE
  b.`datetime` < DATE_SUB(NOW(), INTERVAL 2 YEAR);
于 2013-03-06T14:01:46.490 に答える
1

DELETEコマンドは行全体を削除するために使用されるため、正しい構文は次のようになります。

DELETE FROM yourtable WHERE...

DELETE(何か)FROMを実行すると機能しません

それが役に立てば幸い

于 2013-03-06T13:55:35.027 に答える
0
DELETE FROM 
  `line`
WHERE
   order_id IN 
      (SELECT id
       FROM order
       WHERE `datetime`< DATE_SUB(NOW(), INTERVAL 2 YEAR)
于 2013-03-06T13:59:06.177 に答える
0

これを試して:

DELETE FROM `line` WHERE `order_id` IN (SELECT `id` FROM `order` 
WHERE `datetime` < DATE_SUB(NOW(), INTERVAL 2 YEAR));

もっと重いかもしれません。

于 2013-03-06T14:05:23.433 に答える