7

orders と orders_items の 2 つのテーブルがあります。どちらもフィールド orderID を共有しています。

orderID=500 の両方のテーブルからすべての行を削除したいのですが、これを行う必要があるのは 1 つのクエリだけです。これは可能ですか?

4

6 に答える 6

10

きっとあなたはそれを行うことができます:

DELETE FROM `table1`, `table2` WHERE `orderId` = 500

http://dev.mysql.com/doc/refman/5.0/en/delete.htmlを参照してください。

[編集:]

これは全体のトリックです:

DELETE FROM `orders`, `orders_items` 
  USING `orders` 
  INNER JOIN `orders_items` ON `orders`.`orderId` = `orders_items`.`orderId` 
  WHERE `orders`.`orderId`= 500

orderId が varchar の場合は、ステートメントを に変更し = '500'ます。

于 2009-08-27T09:18:04.257 に答える
8

ON DELETE CASCADEでテーブルを定義できます。そうすれば、order テーブルで削除するだけで済みます。そのオプションを有効にしてorder_idを外部キーとして使用する他のテーブルのエントリは、自動的に削除されます。

この例は、MySQL のマニュアルから抜粋したものです。

CREATE TABLE parent(
    id INT NOT NULL,
    PRIMARY KEY (id)
) ENGINE=INNODB;

CREATE TABLE child(
    id INT, parent_id INT,
    INDEX par_ind (parent_id),
    FOREIGN KEY (parent_id) REFERENCES parent(id) ON DELETE CASCADE
) ENGINE=INNODB;

エンジンは InnoDB であることに注意してください。

于 2009-08-27T09:16:15.367 に答える
3

FOREIGN KEYそれはデータベースエンジンによって異なりますが、基本的に必要なのは、 withON DELETE CASCADEオプションを使用して一方のテーブルを他方のテーブルに参照させ、親テーブルから削除すると、依存テーブルから対応する行が自動的に削除されるように聞こえます。

于 2009-08-27T09:20:42.083 に答える
2

InnoDB (またはそれらをサポートするストレージ エンジン) を使用している場合は、FOREIGN KEY 制約を使用して対応する行を削除できます。外部キーによるわずかなパフォーマンスへの影響を気にしない場合、これは最も簡単で安全な方法の 1 つです。ただし、制約のために削除された行はトリガーを起動しないことに注意してください。

または、トリガーを使用することもできます。それらはあらゆるストレージ エンジンで動作し、通常は簡単に記述できます。私はそれらを気に入っていますが、一度に多数の行 (数百または数千) を削除する場合、あまりパフォーマンスが高くありません。

CREATE TRIGGER ad_orders AFTER DELETE ON orders
FOR EACH ROW DELETE FROM orders_items WHERE orderID = OLD.orderID;

最後に、前の回答で提案されているように、マルチテーブル DELETE を使用できます。

DELETE o, oi
FROM orders o
LEFT JOIN orders_items oi USING (orderID)
WHERE o.orderID = 500;
于 2009-08-27T09:35:58.790 に答える
2

MySQL/PgSQLを使用している場合の簡単な解決策は次のとおりです...

DELETE t1, t2 FROM table1 AS t1 
LEFT JOIN table2 AS t2 USING( orderID ) 
WHERE t1.orderID = 500;

魔法のように動作することが保証されています!

table1table2を適切なテーブル名に置き換えてください。

カスタム設計された CMS でこのクエリを大量に使用しました。2 つの異なるアトミック クエリを避けたい場合はどこでも。これはカスケード削除と同じくらい優れており、クエリを拡張して、必要な数のテーブルにまたがることができます。

3 つのテーブルを含む別の例を次に示します。

DELETE t1, t2, t3 FROM table1 AS t1 
LEFT JOIN table2 AS t2 USING( orderID ) 
LEFT JOIN table3 AS t3 USING( orderID ) 
WHERE t1.orderID = 500;

乾杯、m^e

于 2009-08-27T09:29:42.237 に答える
1

ストアド関数を使用してそれを呼び出すことができますか?

そして、ストアド関数内には、両方の DELETE クエリがあります。次に、ストアド関数が呼び出されると、トランザクションとして実行され、好きなものを返すようにすることができます。

于 2009-08-27T09:15:53.947 に答える