我有一个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
但是当我删除标记时,与其关联的消息不会被删除。关于我在这里做错了什么见解?
编辑: 这是我展示删除过程的图像:
模式
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:架构重构
这是我新更新的架构:
正如您所看到的,当我尝试运行它时,我收到的错误是无效的:
答案 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;