Mysql:如果更新了父级的状态,则更改所有子记录的状态

时间:2016-09-05 07:37:50

标签: mysql foreign-keys relational-database

我有2张桌子

1。父

Parent_ID(PK)| name    | status
--------------------------------
1            |parent 1 |enable
2            |parent 2 |enable
3            |parent 3 |disable

2。子

Child_Id(PK)| Parent_ID(Fk of parent table) | name     | status
----------------------------------------------------------
1           |1                              | child 1  | enable
2           |1                              | child 2  | enable
3           |1                              | child 3  | enable
4           |1                              | child 4  | enable
5           |2                              | child 5  | enable
6           |2                              | child 6  | enable
7           |2                              | child 7  | enable
8           |2                              | child 8  | enable
9           |3                              | child 9  | disable
10          |3                              | child 10 | disable
11          |3                              | child 11 | disable
12          |3                              | child 12 | disable

现在我想在两个表之间设置关系,这样如果父表中记录的状态发生变化,那么其所有子行的状态也应该发生变化。

我知道我可以使用触发器执行此操作,但我认为应该采用某种方式来处理多列上的关系和FK约束。

1 个答案:

答案 0 :(得分:0)

您需要在引用onScrolllistenScrollEvent() { console.log('Scroll event detected!'); } render() { return ( <table onScroll={this.listenScrollEvent}> [...] </table> ) } 的{​​{1}}表格中创建复合外键。

这是一个演示:

child

<强>测试

现在尝试更新父表中parent_id的{​​{1}}字段。

此更改也会触发status表中所有子条目状态值的更改。

-- ----------------------------
-- Table structure for `parenttable`
-- ----------------------------
DROP TABLE IF EXISTS `parenttable`;
CREATE TABLE `parenttable` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `status` int(11) NOT NULL,
  PRIMARY KEY (`ID`),
  KEY `ID` (`ID`,`status`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of parenttable
-- ----------------------------
INSERT INTO `parenttable` VALUES ('1', '1');
INSERT INTO `parenttable` VALUES ('2', '0');
INSERT INTO `parenttable` VALUES ('3', '1');

-- ----------------------------
-- Table structure for `childtable`
-- ----------------------------
DROP TABLE IF EXISTS `childtable`;
CREATE TABLE `childtable` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `parent_id` int(11) NOT NULL,
  `status` int(11) NOT NULL,
  PRIMARY KEY (`ID`),
  KEY `fk_childTable_parent_id` (`parent_id`,`status`),
  CONSTRAINT `fk_childTable_parent_id` FOREIGN KEY (`parent_id`, `status`) REFERENCES `parenttable` (`ID`, `status`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of childtable
-- ----------------------------
INSERT INTO `childtable` VALUES ('1', '1', '1');
INSERT INTO `childtable` VALUES ('3', '1', '1');
INSERT INTO `childtable` VALUES ('6', '1', '1');
INSERT INTO `childtable` VALUES ('4', '2', '0');
INSERT INTO `childtable` VALUES ('5', '2', '0');

<强>输出:

status

同样适用于ID = 1操作

See Demo

如果您以后需要添加外键约束:

child