2012-03-21 65 views
0

問題是,當OPID從p_operators一個是狀態1,則 n_notify表中的所有狀態行udating 1 我想它應該只更新相關op_id狀態...Mysql的關係相關的行沒有正確更新

`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

你的第二個限制鏈接在p_operatorsstatusstatusn_notify,這顯然意味着,在p_operators改變地位n_notify改變了status所有相同的值。

由於您不想級聯自身的狀態,而是通過id對行進行狀態,所以不需要約束,而是觸發器。

憑經驗:

  • 如果你只需要一個字段,使用約束
  • 如果您需要兩個或多個字段(ID來標識,狀態改變)使用觸發器
+0

感謝合作Eugen。有很多op_id的。以及如果你能舉一個例子,那就明白了。 – memo 2012-03-21 02:56:02