如果PREARY KEY由FOREIGN KEY引用,则MySQL REPLACE的行为与UPDATE不同

Pau*_*aul 3 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;
Run Code Online (Sandbox Code Playgroud)

如果我REPLACE类别表(一行)中创建a ,则将丢弃引用类别表中已修改行的事件表中的所有条目.

但是,如果我UPDATE类别表中的一行,那么事件表中的条目保持不变.

为什么会出现这种情况,为什么当我REPLACE输入引用该列的所有条目时都会被丢弃?

我尝试了两种ON UPDATE CASCADE和默认的相同行为.

谷歌无法帮助我.

Mar*_*ski 6

你有ON DELETE CASCADE外键,替换只是"删除然后插入新版本" - 似乎ON DELETE触发器被触发.

来自Mysql文档:

REPLACE与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