我有一个 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:架构重构
这是我新更新的架构:
正如您所看到的,当我尝试运行它时,我收到一条错误消息,表明它无效:
最佳答案
您创建的外键不会按您期望的方式工作。在您的架构下,如果从 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;
关于mysql - 删除级联时不删除关联条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29441946/