orders と orders_items の 2 つのテーブルがあります。どちらもフィールド orderID を共有しています。
orderID=500 の両方のテーブルからすべての行を削除したいのですが、これを行う必要があるのは 1 つのクエリだけです。これは可能ですか?
きっとあなたはそれを行うことができます:
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'
ます。
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 であることに注意してください。
FOREIGN KEY
それはデータベースエンジンによって異なりますが、基本的に必要なのは、 withON DELETE CASCADE
オプションを使用して一方のテーブルを他方のテーブルに参照させ、親テーブルから削除すると、依存テーブルから対応する行が自動的に削除されるように聞こえます。
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;
MySQL/PgSQLを使用している場合の簡単な解決策は次のとおりです...
DELETE t1, t2 FROM table1 AS t1
LEFT JOIN table2 AS t2 USING( orderID )
WHERE t1.orderID = 500;
魔法のように動作することが保証されています!
table1とtable2を適切なテーブル名に置き換えてください。
カスタム設計された 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
ストアド関数を使用してそれを呼び出すことができますか?
そして、ストアド関数内には、両方の DELETE クエリがあります。次に、ストアド関数が呼び出されると、トランザクションとして実行され、好きなものを返すようにすることができます。