1つのクエリで2つのテーブルから削除する


84

MySQLに2つのテーブルがあります

#messages table  : 
messageid
messagetitle 
.
.

#usersmessages table 
usersmessageid 
messageid
userid
.
.

メッセージテーブルから削除したい場合は問題ありません。しかし、messageidでメッセージを削除すると、レコードはまだusersmessageに存在し、この2つのテーブルから一度に削除する必要があります。

次のクエリを使用しました:

DELETE FROM messages LEFT JOIN usersmessages USING(messageid) WHERE messageid='1' ; 

それから私はテストします

   DELETE FROM messages , usersmessages 
   WHERE messages.messageid = usersmessages.messageid 
   and messageid='1' ; 

しかし、これら2つのクエリはこのタスクを実行していません。

回答:


137

それらをセミコロンで区切ることはできませんか?

Delete from messages where messageid = '1';
Delete from usersmessages where messageid = '1'

または

INNER JOIN以下のように使用してください

DELETE messages , usersmessages  FROM messages  INNER JOIN usersmessages  
WHERE messages.messageid= usersmessages.messageid and messages.messageid = '1'

1
このコードをループに入れたい場合はどうなりますか?私はセミコロンを絶対に置くことができることを知っています。
mehdi

1
ループに入れることができます。プログラムで実行し、メッセージIDをパラメーターとして送信できます。同じIDを送信し続けない限り、削除は何度も行われません。
エリック

4
これを2つのクエリで行う場合は、実際にはこれをトランザクションでラップする必要があります。ループで削除クエリを実行する場合は、単一のクエリを作成してすべての削除を実行することをお勧めします。
JohnFx 2009

1
結合を使用した削除クエリの別の例を確認してくださいbennadel.com/blog/…–
Babar

21
SQL Serverでは機能しません:「、」の近くの構文が正しくありません。
Paul-Sebastian Manole 2015

45
DELETE a.*, b.* 
FROM messages a 
LEFT JOIN usersmessages b 
ON b.messageid = a.messageid 
WHERE a.messageid = 1

翻訳:テーブルから削除メッセージテーブル場合にイベントID = 1は、uersmessagesはイベントID =メッセージIDテーブルを有するメッセージ、の行を削除uersmessagesのテーブル。


すべてのコメント:この例に示されているように、削除が機能するテーブルを指定することが重要です。偉大なポストの@angry_kiwi
Raphael_b

左B usersmessagesは、メッセージのJOINから私は、ちょうど順序を変更しなければならなかった
パブロ

15

あなたは、どちらか作成する必要がありますFOREIGN KEYON DELETE CASCADE

ALTER TABLE usersmessages
ADD CONSTRAINT fk_usermessages_messageid
FOREIGN KEY (messageid)
REFERENCES messages (messageid)
ON DELETE CASCADE

、またはトランザクションで2つのクエリを使用して実行します。

START TRANSACTION;;

DELETE
FROM    usermessages
WHERE   messageid = 1

DELETE
FROM    messages
WHERE   messageid = 1;

COMMIT;

InnoDBただし、トランザクションはテーブルにのみ影響します。


3
あなたはできる1つのクエリで複数のテーブルから削除します!dev.mysql.com/doc/refman/5.0/en/delete.html
txwikinger

はい、できます!しかし、私には...私の答えが言ったことをする方が簡単です。
エリック

私は同じようなテーブルにカスケードを追加しました。1つのテーブルからのみ削除しようとすると、レコードが削除され、関連するテーブルが孤立したままになりました。制約は何が良いですか?
barfoon 2010年

@barfoon:あなたのテーブルはInnoDB
Quassnoi 2010年

@Quassnoiおっと!私は間違いなくそれが何だと思った。すべてのテーブルはMyISAMです。データを入れてその場ですべてを変更できますか?それとも問題がありますか?
barfoon 2010年

7

2つのオプションがあります。

まず、トランザクション内で2つのステートメントを実行します。

BEGIN;
  DELETE FROM messages WHERE messageid = 1;
  DELETE FROM usermessages WHERE messageid = 1;
COMMIT;

または、外部キーを使用してON DELETECASCADEを設定することもできます。これはより良いアプローチです。

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

CREATE TABLE child (
  id INT, parent_id INT,
  FOREIGN KEY (parent_id) REFERENCES parent(id) ON DELETE CASCADE
);

ON DELETE CASCADEの詳細については、こちらをご覧ください


7

JOINSの必要はありません:

DELETE m, um FROM messages m, usersmessages um

WHERE m.messageid = 1 

AND m.messageid = um.messageid 

6
DELETE message.*, usersmessage.* from users, usersmessage WHERE message.messageid=usersmessage.messageid AND message.messageid='1'

6

OPは、削除後にテーブルエイリアスが欠落しているだけです

DELETE t1, t2 
FROM table1 t1 LEFT JOIN table2 t2 ON t1.id = t2.id 
WHERE t1.id = some_id

3
ご回答有難うございます。これが機能する理由とOPソリューションが機能しなかった理由を説明しようとすると、さらに役立ちます。
ddW 2018

1

これを試してください

DELETE FROM messages,usersmessages

USING messages

INNER JOIN usermessages on (messages.messageid = usersmessages.messageid)

WHERE messages.messsageid='1'

0

これを試して..

DELETE a.*, b.*  
FROM table1 as a, table2 as b  
WHERE a.id=[Your value here] and b.id=[Your value here]

私は聞かせてidサンプル列として。

これがお役に立ててうれしいです。:)


アスタリスク(*)が適切にレンダリングされるようにするには、クエリの前に4つのスペースを入れてインデントする必要があります。
Al.G.

0

このように使用して、両方の列に同じ列名が2つ以上ある場合に、特定の値を削除することもできます。

DELETE project , create_test  FROM project INNER JOIN create_test
WHERE project.project_name='Trail' and  create_test.project_name ='Trail' and project.uid= create_test.uid = '1';

0

ここで言及されていない別の方法があります(私はまだそのパフォーマンスを完全にテストしていません)、あなたは以下のように削除したいすべてのテーブル->行に配列を設定することができます

// set your tables array
$array = ['table1', 'table2', 'table3'];


// loop through each table
for($i = 0; $i < count($array); $i++){

 // get each single array
 $single_array = $array[$i];

 // build your query
 $query = "DELETE FROM $single_array WHERE id = 'id'";

 // prepare the query and get the connection
 $data = con::GetCon()->prepare($query);

 // execute the action
 $data->execute();
}

次に、ユーザーをホームページにリダイレクトできます。

header('LOCATION:' . $home_page);

これが誰かを助けることを願っています:)

ありがとう


これは誰かを助けるかもしれません... PHPのように見えますが、それが必ずしも質問の範囲内にあるとは思いません:)
トムブッシュ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.