2016-09-05 4 views
1

У меня есть 2 таблицыMysql: Изменить статус всех дочерних записей, если статус родителя обновляется

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 

Now Я хочу установить связь между обеими таблицами так, что если статус записи в родительских таблицах изменится, то статус всего ее дочернего r ow также должен получить изменения.

Я знаю, что могу сделать это с помощью триггеров, но я думаю, что для этого нужно иметь некоторый способ сделать это с отношениями и ограничением FK для нескольких столбцов.

+0

Я предполагаю, что 'ON UPDATE CASCADE' будет делать. – 1000111

+0

, но какой должен быть ключ. Я имею в виду, что я не могу установить отношение FK к статусу, поскольку мне также нужно связать его с parent_id, как установить эту связь между этими двумя столбцами. – Arpita

+0

Возможно, вам нужно создать сопряженные внешние ключи. Дай мне проверить – 1000111

ответ

0

Вам необходимо создать составной внешний ключ в таблице со ссылкой на parent_id и 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 в родительской таблице.

Это изменение приведет к изменению значений статуса всех дочерних записей в таблице child.

UPDATE parentTable SET status = 0 WHERE ID = 1; 

SELECT * FROM childTable WHERE parent_id = 1; 

Выход:

ID  parent_id  status 

1   1   0 
2   1   0 
3   1   0 

То же справедливо и для DELETE операции

See Demo


И если вам нужно добавить ограничение внешнего ключа позже:

ALTER TABLE `childTable` ADD CONSTRAINT `fk_childTable_parent_id_status` FOREIGN KEY (
    `parent_id`, 
    `status` 
) REFERENCES `parentTable` (`ID`, `status`) ON DELETE CASCADE ON UPDATE CASCADE; 
Смежные вопросы