我正在尝试使用SQL从多个表中删除多行 联合起来。
表A与表B相结合 表B与表C相结合
我想删除表B&表中的所有行C对应于表A中的一行
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`)
);
答案 0 :(得分:18)
好吧,如果你使用过InnoDB表,你可以设置cascading delete with foreign keys来自动完成所有操作。但如果你有使用MyISAM的原因,你只需使用multiple-table 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;
答案 1 :(得分:6)
如果您使用带有“on delete cascade”的外键,则可以通过db-system完成此操作。
看看这里: http://dev.mysql.com/doc/refman/5.1/en/innodb-foreign-key-constraints.html
答案 2 :(得分:2)
您可以选择是否存在
delete from topics where boardid in (select boardid from boards)
delete from messages where boardid in (select boardid from boards)
但只有这种行为不应该总是适用时才有意义。当应始终应用该行为时,在cascade上使用delete实现外键
在zali网站上,在您的帮助文件和here
中进行了解释答案 3 :(得分:1)
从多个表中删除行可以通过两种方式完成:
多表DELETE语句可以用两种格式编写。以下示例演示了一种语法,用于从表t1中删除行的查询,其中id值与表t2中的行匹配:
DELETE t1 FROM t1, t2 WHERE t1.id = t2.id;
第二种语法略有不同:
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通常支持的ORDER BY和LIMIT子句。