0

Исходное состояниевнешнего ключа отношение ограничение - каскад на обновление также другое значение иностранного идентификатора

parents 
id parent_validity 
1  1 
2  1 

children 
id parent_id child_validity 
1  1   1 
2  1   1 
3  2   1 

ТРЕБУЕТСЯ СОСТОЯНИЕ ПОСЛЕ UPDATE

parents 
id parent_validity 
1  0 (updated as 0) 
2  1 

children 
id parent_id child_validity 
1  1   0 (This val is expected as 0) 
2  1   0 (This val is expected as 0) 
3  2   1 (This val is expected as no change) 

ЧТО Я ПОЛУЧИЛ

children 
id parent_id child_validity 
1  1   0 
2  1   0 
3  2   0 (all values under this column became 0) 

Что я хочу, если я обновляю parent_validity в таблице parents, тогда связанный child_validity в таблице children должен быть обновлен. То, что я имею в виду от связанных является внешним ключевым отношением id s.

Мой результат: Любое изменение действительности в таблице parents изменяется все действия в таблице children.

Я не хочу делать то, что мне нужно с PHP. пусть MySQL обрабатывает.

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

Благодарим за помощь.

примечание: я думаю, что мой заголовок q нуждается в обновлении. (Это был мой лучший, извините.)

My SQL, чтобы создать и дать ограничения

CREATE TABLE `parents` (
    `id` int(2) unsigned NOT NULL AUTO_INCREMENT, 
    `parent_validity` bit(1) NOT NULL COMMENT '1:valid or 0:invalid', 
    PRIMARY KEY (`id`), 
    KEY (`parent_validity`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 

CREATE TABLE `children` (
    `id` int(2) unsigned NOT NULL AUTO_INCREMENT, 
    `parent_id` int(2) unsigned NOT NULL, 
    `child_validity` bit(1) NOT NULL COMMENT '1:valid or 0:invalid', 
    PRIMARY KEY (`id`), 
    KEY (`child_validity`), 
    CONSTRAINT fk_parent_id FOREIGN KEY (parent_id) REFERENCES parents(id) ON UPDATE CASCADE, 
    CONSTRAINT fk_parent_validity FOREIGN KEY (child_validity) REFERENCES parents(parent_validity) ON UPDATE CASCADE 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 

ответ

1

Опцион является составным ключом, но вы должны оценить влияние дизайна, которое это влечет за ваше решение:

mysql> DROP TABLE IF EXISTS `children`, `parents`; 
Query OK, 0 rows affected (0.00 sec) 

mysql> CREATE TABLE `parents` (
    -> `id` int(2) unsigned NOT NULL AUTO_INCREMENT, 
    -> `parent_validity` bit(1) NOT NULL COMMENT '1:valid or 0:invalid', 
    -> PRIMARY KEY (`id`, `parent_validity`) 
    ->); 
Query OK, 0 rows affected (0.00 sec) 

mysql> CREATE TABLE `children` (
    -> `id` int(2) unsigned NOT NULL AUTO_INCREMENT, 
    -> `parent_id` int(2) unsigned NOT NULL, 
    -> `child_validity` bit(1) NOT NULL COMMENT '1:valid or 0:invalid', 
    -> PRIMARY KEY (`id`), 
    -> KEY (`parent_id`, `child_validity`), 
    -> CONSTRAINT `fk_parent_id_child_validity` FOREIGN KEY (`parent_id`, `child_validity`) 
    -> REFERENCES `parents` (`id`, `parent_validity`) ON UPDATE CASCADE 
    ->); 
Query OK, 0 rows affected (0.01 sec) 

mysql> INSERT INTO 
    -> `parents` 
    -> VALUES 
    -> (NULL, 1), (NULL, 1); 
Query OK, 2 rows affected (0.00 sec) 
Records: 2 Duplicates: 0 Warnings: 0 

mysql> INSERT INTO 
    -> `children` 
    -> VALUES 
    -> (NULL, 1, 1), 
    -> (NULL, 1, 1), 
    -> (NULL, 2, 1); 
Query OK, 3 rows affected (0.00 sec) 
Records: 3 Duplicates: 0 Warnings: 0 

mysql> SELECT 
    -> `id`, 
    -> CONVERT(`parent_validity`, UNSIGNED) `parent_validity` 
    -> FROM 
    -> `parents`; 
+----+-----------------+ 
| id | parent_validity | 
+----+-----------------+ 
| 1 |    1 | 
| 2 |    1 | 
+----+-----------------+ 
2 rows in set (0.00 sec) 

mysql> SELECT 
    -> `id`, 
    -> `parent_id`, 
    -> CONVERT(`child_validity`, UNSIGNED) `child_validity` 
    -> FROM 
    -> `children`; 
+----+-----------+----------------+ 
| id | parent_id | child_validity | 
+----+-----------+----------------+ 
| 1 |   1 |    1 | 
| 2 |   1 |    1 | 
| 3 |   2 |    1 | 
+----+-----------+----------------+ 
3 rows in set (0.00 sec) 

mysql> UPDATE `parents` 
    -> SET `parent_validity` = 0 
    -> WHERE `id` = 1; 
Query OK, 1 row affected (0.00 sec) 
Rows matched: 1 Changed: 1 Warnings: 0 

mysql> SELECT 
    -> `id`, 
    -> CONVERT(`parent_validity`, UNSIGNED) `parent_validity` 
    -> FROM 
    -> `parents`; 
+----+-----------------+ 
| id | parent_validity | 
+----+-----------------+ 
| 1 |    0 | 
| 2 |    1 | 
+----+-----------------+ 
2 rows in set (0.00 sec) 

mysql> SELECT 
    -> `id`, 
    -> `parent_id`, 
    -> CONVERT(`child_validity`, UNSIGNED) `child_validity` 
    -> FROM 
    -> `children`; 
+----+-----------+----------------+ 
| id | parent_id | child_validity | 
+----+-----------+----------------+ 
| 1 |   1 |    0 | 
| 2 |   1 |    0 | 
| 3 |   2 |    1 | 
+----+-----------+----------------+ 
3 rows in set (0.00 sec) 
1

Создание ограничение CONSTRAINT fk_parent_validity FOREIGN KEY (child_validity) REFERENCES parents(parent_validity) ON UPDATE CASCADE создает новый внешний ключ между вашими таблицами.

Как обновить parent_validity со значением 1 и изменить его на 0, MySQL каскады это с внешним ключом, чтобы установить все ссылки, где значение было 1 и обновления до 0 (в этом случае все child_validity, где он первоначально был 1).

Вместо внешнего ключа вам необходимо использовать триггер UPDATE. Триггеры - это дополнительные процедуры, которые автоматически запускаются при возникновении события в базе данных. Здесь вам нужен триггер «UPDATE».

Думает, что это может работать:

CREATE TRIGGER update_child_validitiy AFTER UPDATE ON parents FOR EACH ROW BEGIN UPDATE children SET child_validity = NEW.parent_validity WHERE id = NEW.id; END;

Я не использовал триггера много, но, надеюсь, эти ссылки помощь:

http://dev.mysql.com/doc/refman/5.7/en/trigger-syntax.html https://www.techonthenet.com/mysql/triggers/after_update.php

+0

благодарит за вашу ценную информацию. Я не знал о концепции триггера. Мне нужно читать и изучать его. Не может ли это быть достигнуто только с помощью 'ограничения?Мне нужно только обновление как оригинальное без дополнительной операции. –

+0

Я обновил свой ответ, чтобы попытаться объяснить лучше. Вторая ссылка казалась более легкой, но у меня не было много опыта работы с триггерами MySQL. –

Смежные вопросы