在删除级联时不删除关联条目

时间:2015-04-04 02:01:20

标签: mysql

我有一个marks表,用于保存关联消息的外键。我使用ON DELETE期望删除marks表中的条目也会删除关联的消息。但它没有按预期工作。 I checked out all the other post and can't find any relevant to this one.

我可以成功插入数据库

DELETE FROM marks WHERE x = 37.7836

但是当我删除标记时,与其关联的消息不会被删除。关于我在这里做错了什么见解?

编辑: 这是我展示删除过程的图像: enter image description here

模式

DROP DATABASE uncovery;
CREATE DATABASE uncovery;

SET foreign_key_checks=0;

USE uncovery;

CREATE TABLE marks (
  id int(5) AUTO_INCREMENT,
  x float(10, 6),
  y float(10, 6),
  z float(10, 6),
  timestamp timestamp DEFAULT CURRENT_TIMESTAMP,
  messageId int(5),
  FOREIGN KEY (messageId)
    REFERENCES messages(id)
    ON DELETE CASCADE,
  PRIMARY KEY (id)
);

CREATE TABLE messages (
  id int(5) AUTO_INCREMENT,
  messageString text,
  PRIMARY KEY (id)
);

编辑2:架构重构

这是我新更新的架构: enter image description here

正如您所看到的,当我尝试运行它时,我收到的错误是无效的:

enter image description here

1 个答案:

答案 0 :(得分:2)

您创建的外键不会像您期望的那样工作。在您的架构下,如果从messages删除了一个条目,它将删除marks表中的所有相应条目,而不是相反。

此外,您必须确保为表使用InnoDB存储引擎,或者您的外键根本不起作用。 MyISAM引擎类型不支持它们。

要使您的架构正常工作,删除标记将导致删除邮件,您需要在邮件表中使用markId作为外键,如下所示:

CREATE TABLE `messages` (
  `id` int(5) NOT NULL auto_increment,
  `messageString` text,
  `markId` int(5) default NULL,
  PRIMARY KEY  (`id`),
  KEY `markId` (`markId`),
  CONSTRAINT `messages_ibfk_1` FOREIGN KEY (`markId`) REFERENCES `marks` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB;

CREATE TABLE `marks` (
  `id` int(5) NOT NULL auto_increment,
  `x` float(10,6) default NULL,
  `y` float(10,6) default NULL,
  `z` float(10,6) default NULL,
  `timestamp` timestamp NOT NULL default CURRENT_TIMESTAMP,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB;