如何使用SQL查询删除父表和子表行?

时间:2016-01-29 07:37:23

标签: mysql

我想从父表和子表中删除行。

例如

我有两张桌子:  1)  2) group_member

表包含以下字段:

  

group_id Group_name user_id

group_member 包含以下字段:

  

id group_id user_id

我想删除这样的内容,

假设表有   user_id 2 user_id 的所有成员均可在 group_member

上找到

表1图像

enter image description here

表2图像

enter image description here

如果删除查询,则会删除所有 id = 19的记录  表

3 个答案:

答案 0 :(得分:-1)

我建议您在此方案中使用ON CASCADE DELETE

来自MYSQL Doc

  

CASCADE:从父表中删除或更新行,并自动删除或更新子表中的匹配行。支持ON DELETE CASCADE和ON UPDATE CASCADE。在两个表之间,不要定义几个ON UPDATE CASCADE子句,这些子句作用于父表或子表中的同一列。

注意:级联外键操作不会激活触发器。

答案 1 :(得分:-1)

您需要使用DELETE CASCADE,只需使用下表并进行测试。

-- ----------------------------
-- Table structure for candidate_master
-- ----------------------------
DROP TABLE IF EXISTS `candidate_master`;
CREATE TABLE `candidate_master` (
  `candidate_id` int(10) unsigned NOT NULL,
  `first_name` varchar(100) DEFAULT NULL,
  `middle_name` varchar(100) DEFAULT NULL,
  `last_name` varchar(100) DEFAULT NULL,
  `phone_number` varchar(25) NOT NULL,
  `callerid` varchar(25) DEFAULT NULL,
  `duration` int(11) DEFAULT NULL,
  `city` varchar(50) DEFAULT NULL,
  `state` varchar(80) DEFAULT NULL,
  `date_modified` datetime DEFAULT NULL,
  `key_skills` text,
  `visa` varchar(20) DEFAULT NULL,
  `status` varchar(100) DEFAULT NULL,
  `pvm` enum('voicemail','ping') DEFAULT NULL,
  `id` int(11) NOT NULL,
  `isDNC` enum('NO','YES') NOT NULL DEFAULT 'NO',
  UNIQUE KEY `number` (`phone_number`) USING BTREE,
  KEY `candidate_master_ibfk_1` (`id`),
  CONSTRAINT `candidate_master_ibfk_1` FOREIGN KEY (`id`) REFERENCES `cgListUpdateLog` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

-- ----------------------------
-- Table structure for cgListUpdateLog
-- ----------------------------
DROP TABLE IF EXISTS `cgListUpdateLog`;
CREATE TABLE `cgListUpdateLog` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `file_name` varchar(255) DEFAULT NULL,
  `pass` int(11) DEFAULT NULL,
  `fail` int(11) DEFAULT NULL,
  `UpdatedOn` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `status` enum('NEW','PROCESSING','PROCESSED','FAILED') DEFAULT NULL,
  `dialStatus` enum('YES','NO') DEFAULT 'NO',
  `notDialed` int(11) DEFAULT NULL,
  `filestatus` enum('processed','pending') DEFAULT 'processed',
  `comment` varchar(50) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=101 DEFAULT CHARSET=latin1;

如有任何进一步的帮助,请告诉我!!

答案 2 :(得分:-1)

其他答案很好,但这里有一些针对您问题的SQL。如上所述,使用数据库为你做神奇的事。

使用FOREIGN KEY引用选项向group_member表添加ON DELETE CASCADE约束:

ALTER TABLE `group_member`
ADD CONSTRAINT `fk_group_member_group` FOREIGN KEY ( `group_id` )
REFERENCES `group` ( `group_id` ) ON DELETE CASCADE;

这将确保具有特定ID的组上的删除将级联到group_member表。