关系说明:活动表中存有多个活动,他与广告组的关系是1对多的,即一个活动可以有多个广告组;广告组与广告也是一对多的,即一个广告组可以有多个广告。
问题描述:首先我知道用程序写也可以实现我的功能,但是我想对比下级联操作,毕竟直接在数据库中通过级联操作去处理要方便的多,我想实现的目标是,删除任何一个活动,要把所属的广告组和广告全部删除,更新任何一个活动的state,也要把所属这个活动的广告的state更新,处理广告组同上了,就是把下面的广告也一起处理。
我试过两表间这种级联删除方式是可以的,但是3表会出现一个问题,比如我删除id=1的活动,它把对应活动id=1的广告组删除了,没问题,但是广告全部删除了,而不是只删除所属这个活动的广告。更新就更不行了,其实本质是只有广告有状态,但是我为了整体操作方便,比如给某个活动或者某个广告组修改状态,那它下面的广告状态也要变,所以我给活动表和广告组表都加了state字段,但是级联外键的话又没法设置,不知道有什么好方法吗?
建表语句:
活动表CREATE TABLE `activity` (
`id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
`name` VARCHAR(100) NOT NULL DEFAULT '',
`state` INT(10) NULL DEFAULT '0',
PRIMARY KEY (`id`)
)
ENGINE=InnoDB广告组表CREATE TABLE `ad_group` (
`id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
`name` VARCHAR(100) NOT NULL DEFAULT '',
`activity_id` INT(11) UNSIGNED NOT NULL,
`state` INT(10) NULL DEFAULT '0',
PRIMARY KEY (`id`),
INDEX `activity_id` (`activity_id`),
CONSTRAINT `FK_ad_group_activity` FOREIGN KEY (`activity_id`) REFERENCES `activity` (`id`) ON UPDATE CASCADE ON DELETE CASCADE
)
ENGINE=InnoDB广告表CREATE TABLE `ad` (
`id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
`name` VARCHAR(100) NOT NULL DEFAULT '',
`group_id` INT(11) UNSIGNED NOT NULL,
`state` INT(11) UNSIGNED NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
INDEX `group_id` (`group_id`),
CONSTRAINT `ad_ibfk_1` FOREIGN KEY (`group_id`) REFERENCES `ad_group` (`id`) ON UPDATE CASCADE ON DELETE CASCADE
)
ENGINE=InnoDB测试数据:
活动表INSERT INTO `activity` (`id`, `name`, `state`) VALUES (1, '第一次推广测试活动', 0), (2, '第二次推广测试活动', 0), (3, '第三次推广测试活动', 0);广告组表INSERT INTO `ad_group` (`id`, `name`, `activity_id`, `state`) VALUES (1, '第一组', 1, 0), (2, '第二组', 1, 0), (3, '第三组', 1, 0), (4, '第四组', 2, 0), (5, '第五组', 2, 0), (6, '第六组', 3, 0), (7, '第七组', 3, 0);广告表INSERT INTO `ad` (`id`, `name`, `group_id`, `state`) VALUES (1, '广告1', 1, 0), (2, '广告2', 1, 0), (3, '广告3', 1, 0), (4, '广告4', 2, 0), (5, '广告5', 2, 0), (6, '广告6', 3, 0), (7, '广告7', 3, 0), (8, '广告8', 3, 0);

解决方案 »

  1.   

    我菜鸟,但我看到楼主设置了
    CONSTRAINT `ad_ibfk_1` FOREIGN KEY (`group_id`) REFERENCES `ad_group` (`id`) ON UPDATE CASCADE ON DELETE CASCADE
    这个,应该可以有级联效果啊。
      

  2.   

    新手路过,也遇到级联删除和更新的问题,我在mysql里设置外键怎么都不起作用,郁闷了,也是按楼主的格式写的