2012-01-12 72 views
0

引用我有兩個表:MySQL的REPLACE行爲不同於更新,如果主鍵是由外鍵

CREATE TABLE `category` (
    `category_id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `user_id` mediumint(8) unsigned NOT NULL, 
    `name` varchar(20) CHARACTER SET ascii NOT NULL, 
    `description` varchar(100) DEFAULT NULL, 
    `repeat_interval` tinyint(3) unsigned NOT NULL DEFAULT '0', 
    `color` mediumint(8) unsigned NOT NULL, 
    PRIMARY KEY (`category_id`), 
    KEY `id` (`user_id`), 
    CONSTRAINT `category_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE CASCADE 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

CREATE TABLE `event` (
    `event_id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `category_id` int(10) unsigned NOT NULL, 
    `name` varchar(20) CHARACTER SET ascii NOT NULL, 
    `description` varchar(100) DEFAULT NULL, 
    `repeat_interval` tinyint(3) unsigned NOT NULL DEFAULT '0', 
    `color` mediumint(8) unsigned NOT NULL, 
    `priority` tinyint(3) unsigned NOT NULL DEFAULT '0', 
    `start` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', 
    `end` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', 
    `done` tinyint(1) NOT NULL DEFAULT '0', 
    PRIMARY KEY (`event_id`), 
    KEY `category_id` (`category_id`), 
    CONSTRAINT `event_ibfk_1` FOREIGN KEY (`category_id`) REFERENCES `category`  (`category_id`) ON DELETE CASCADE 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

如果我的類別表(1行)進行REPLACE那麼所有的條目在事件表中引用類別表中的修改行將被丟棄。

但是,如果我在類別表UPDATE一排,然後在事件表中的條目保持不變。

爲什麼這種行爲,爲什麼當我REPLACE什麼東西所有引用該列的條目都被丟棄?

我試着用ON UPDATE CASCADE和默認的相同的行爲。

Google無法幫助我。

回答

2

你有ON DELETE CASCADE外鍵,而替換就是「刪除然後插入新版本」 - 看起來ON DELETE觸發器被觸發。

從MySQL文檔:

更換作品酷似INSERT,不同之處在於,如果一個老行的 表具有相同的值PRIMARY KEY或一個UNIQUE 指數,老一新行行在插入新行之前被刪除。請參閱 第12.2.5節「INSERT語法」。

我建議你閱讀本:http://dev.mysql.com/doc/refman/5.0/en/replace.html

要解決這一點,你可能會想使用ON DUPLICATE KEY UPDATE插入語句:http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html

1

取代的行爲是刪除,然後重新插入。當您嘗試更新主鍵時這很有用。

我推測與foriegn關鍵的關係,你會得到一個刪除層疊,然後插入到表中,但沒有插入到外部表中。

1

您可能有ON DELETE CASCADE。 REPLACE刪除category表中的記錄,然後刪除分配給該category的所有event記錄。