Mysql Relations связанные строки не обновляются правильно - PullRequest
0 голосов
/ 21 марта 2012

Проблема возникает, когда один из OPID из p_operators имеет статус 1, затем таблица n_notify все строки состояния обновляются 1 Я хочу, чтобы он обновлял только связанный статус op_id ...

`p_operators` (
  `opID` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `status` tinyint(4) NOT NULL DEFAULT '0',
  PRIMARY KEY (`opID`),
  KEY `status` (`status`)
) ENGINE=InnoDB;

`n_notify` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `op_id` int(10) unsigned NOT NULL,
  `email` varchar(155) NOT NULL,
  `status` tinyint(4) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`),
  KEY `status` (`status`),
  KEY `op_id` (`op_id`)
) ENGINE=InnoDB ;

ALTER TABLE `n_notify`
  ADD CONSTRAINT `n_notify_ibfk_2` FOREIGN KEY (`op_id`) REFERENCES `p_operators` (`opID`) ON DELETE CASCADE ON UPDATE CASCADE,
  ADD CONSTRAINT `n_notify_ibfk_1` FOREIGN KEY (`status`) REFERENCES `p_operators` (`status`) ON DELETE CASCADE ON UPDATE CASCADE;


p_operators values
opID    status
5   0
13  1

n_notify values
id  op_id   email   status
2   13  XX  1
3   5   XX  1

1 Ответ

1 голос
/ 21 марта 2012

Ваше второе ограничение связывает status в p_operators до status в n_notify, что, конечно, означает, что изменение статуса в p_operators изменяет все равные значения status в n_notify.

Поскольку вы не хотите каскадировать статус по себе, а статус строки по id, вам не нужно ограничение, а триггер.

Правило большого пальца:

  • Если вам нужно только одно поле, используйте ограничение
  • Если вам нужно два или более полей (идентификатор для идентификации, статус для изменения), используйте триггер
...