2

私は3つのテーブルを持っています:

`MEMBERS`
with
`NAME` varchar(24) UNIQUE KEY

`LAST_LOGGED_IN` int(11) - It is a timestamp!

`HOMES`
with
`OWNER` varchar(24) 

`CARS`
with
`OWNER` varchar(24)

これらのテーブルに InnoDB を使用していますが、実際の質問は次のとおりです。 UNIX_TIMESTAMP()- の場合、すべてのテーブル内の行を削除するにはどうすればよいですかMEMBERSLAST_LOGGED_IN> 864000?

非アクティブなメンバーの行を削除しようとしていますが、これが最も難しいことです。私は約40K行を持っており、増加しています。私はそれを定期的に掃除しますDELETE FROM MEMBERS WHERE UNIX_TIMESTAMP()-LAST_LOGGED_IN> 864000

あなたの助けは非常に感謝しています!ありがとう!!

4

2 に答える 2

1

私はInnoDBを使用していないので、調べなければなりませんでしたが、参照整合性をサポートしているようです。関係を設定してからDELETECASCADEをオンにすると、データベース自体がルールを適用します。つまり、メンバーを削除すると、DBMSが関連する家と車の削除を処理します。

ここここを参照してください、彼らは役立つかもしれません。

于 2012-12-23T03:33:48.360 に答える
1

テーブルからすでに行を削除しており、列の値がテーブル内のどの行の値とも一致しないMEMBERS他の 2 つのテーブルから行を削除する場合は、次のようにします。OWNERNAMEMEMBERS

DELETE h.*
  FROM `HOMES` h
  LEFT
  JOIN `MEMBERS` m 
    ON m.`NAME` = h.`OWNER`
 WHERE m.`NAME` IS NULL

DELETE c.*
  FROM `CARS` c
  LEFT
  JOIN `MEMBERS` m 
    ON m.`NAME` = c.`OWNER`
 WHERE m.`NAME` IS NULL

(注: これらのステートメントはHOMESCARSテーブルから行を削除し、OWNER列を NULL 値として削除します。)

DELETE を実行する前に、SELECT を使用してこれらのステートメントのテストを実行することを強くお勧めします。(キーワード DELETE をキーワード SELECT に置き換えます。

-- DELETE h.*
SELECT h.*
  FROM `HOMES` h
  LEFT
  JOIN `MEMBERS` m 
    ON m.`NAME` = h.`OWNER`
 WHERE m.`NAME` IS NULL

今後、これらのテーブルを「同期」させたい場合は、ON CASCADE DELETE オプションを使用して FOREIGN KEY 制約を定義することを検討してください。

または、3 つのテーブルすべてから行を削除する DELETE ステートメントを使用できます。

DELETE m.*, h.*, c.*
  FROM `MEMBERS` m
  LEFT
  JOIN `HOMES` h
    ON h.`OWNER` = m.`NAME`
  LEFT
  JOIN `CARS` c
    ON c.`OWNER` = m.`NAME`
 WHERE UNIX_TIMESTAMP()-m.`LAST_LOGGED_IN` > 864000

(注意: そこの述語は、列のインデックスを使用できませんLAST_LOGGED_IN。「裸の」列への参照を持つ同等の述語は、インデックスを使用できます。

WHERE m.`LAST_LOGGED_IN` < UNIX_TIMESTAMP()-864000

または同等のもの:

WHERE m.`LAST_LOGGED_IN` < UNIX_TIMESTAMP(NOW() - INTERVAL 10 DAY)

HOMES最高のパフォーマンスを得るには、両方にインデックスが必要CARSであり、先頭の列は ですOWNER

... ON `HOMES` (`OWNER`)
... ON `CARS` (`OWNER`) 
于 2012-12-23T04:08:55.083 に答える