10

SQLを使用して、結合されている複数のテーブルから複数の行を削除しようとしています。

テーブルAはテーブルBに結合されていますテーブルBはテーブルCに結合されています

表Aの行に対応する表BおよびCのすべての行を削除したい

CREATE TABLE `boards` (
  `boardid` int(2) NOT NULL AUTO_INCREMENT,
  `boardname` varchar(255) NOT NULL DEFAULT '',
  PRIMARY KEY  (`boardid`)
);

-- --------------------------------------------------------

-- 
-- Table structure for table `messages`
-- 

CREATE TABLE `messages` (
  `messageid` int(6) NOT NULL AUTO_INCREMENT,
  `boardid` int(2) NOT NULL DEFAULT '0',
  `topicid` int(4) NOT NULL DEFAULT '0',
  `message` text NOT NULL,
  `author` varchar(255) NOT NULL DEFAULT '',
  `date` datetime DEFAULT NULL,
  PRIMARY KEY  (`messageid`)
);

-- --------------------------------------------------------

-- 
-- Table structure for table `topics`
-- 

CREATE TABLE `topics` (
  `topicid` int(4) NOT NULL AUTO_INCREMENT,
  `boardid` int(2) NOT NULL DEFAULT '0',
  `topicname` varchar(255) NOT NULL DEFAULT '',
  `author` varchar(255) NOT NULL DEFAULT '',
  PRIMARY KEY  (`topicid`)
);
4

4 に答える 4

20

そうですね、InnoDBテーブルを使用したことがある場合は、すべてを自動的に実行する外部キーを使用してカスケード削除を設定できます。ただし、MyISAMを使用する理由がある場合は、複数テーブルのDELETEを使用するだけです。

DELETE FROM boards, topics, messages
USING boards INNER JOIN topics INNER JOIN messages
WHERE boards.boardid = $boardid
    AND topics.boardid = boards.boardid
    AND messages.boardid = boards.boardid;
于 2009-04-09T14:58:33.313 に答える
6

これは、「カスケードの削除時」で外部キーを使用している場合、db-systemによって実行できます。

ここを見てください:http: //dev.mysql.com/doc/refman/5.1/en/innodb-foreign-key-constraints.html

于 2009-04-09T14:54:11.703 に答える
2

プレゼンスを確認するだけでもかまいません

delete from topics where boardid in (select boardid from boards)
delete from messages where boardid in (select boardid from boards)

ただし、これは、この動作が常に適用されるとは限らない場合にのみ意味があります。動作が常に適用される必要がある場合は、カスケードで削除を使用して外部キーを実装します

無数のサイト、ヘルプファイル、およびここで説明されています

于 2009-04-09T15:00:11.470 に答える
1

複数のテーブルから行を削除するには、次の2つの方法があります。

  • あるテーブルから行を削除し、別のテーブルを参照して削除する行を決定します
  • 1つのステートメントで複数のテーブルから行を削除する

複数テーブルのDELETEステートメントは、2つの形式で記述できます。次の例は、ID値がテーブルt2の行と一致するテーブルt1から行を削除するクエリの1つの構文を示しています。

DELETE t1 FROM t1, t2 WHERE t1.id = t2.id;

2番目の構文は少し異なります。

DELETE FROM t1 USING t1, t2 WHERE t1.id = t2.id;

両方のテーブルから一致するレコードを削除するには、ステートメントは次のとおりです。

DELETE t1, t2 FROM t1, t2 WHERE t1.id = t2.id;
DELETE FROM t1, t2 USING t1, t2 WHERE t1.id = t2.id;

UPDATEおよびDELETEで通常サポートされているORDERBYおよびLIMIT句は、これらのステートメントが複数表操作に使用される場合は許可されません。

于 2014-02-24T10:12:27.447 に答える