我正在创建两个这样的表:
CREATE TABLE abc (
id INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT,
title VARCHAR(64) NOT NULL,
created DATETIME DEFAULT '0000-00-00 00:00:00',
updated DATETIME DEFAULT '0000-00-00 00:00:00'
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
CREATE TABLE def (
abc_id INTEGER NOT NULL DEFAULT 0,
name VARCHAR(64) NOT NULL,
value LONGTEXT,
PRIMARY KEY(name, abc_id),
CONSTRAINT fk_def FOREIGN KEY(id)
REFERENCES abc(id) ON DELETE CASCADE ON UPDATE RESTRICT
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
这应该告诉mysql在删除ABC中的行时自动从DEF中删除相应的行。
但这对DROP操作不起作用。 如果我试图删除表abc,我会收到一个错误,说外键约束失败。 看来我需要先放弃DEF,然后才能放弃ABC。我不明白为什么,因为丢弃ABC也应该自动降低DEF,对吗?或者至少通过从ABC中删除与id匹配的行来清空它...
答案 0 :(得分:1)
删除表与删除行不同,外键约束将级联删除操作,但要实际删除(删除)表,首先需要删除所有外键约束。
答案 1 :(得分:1)
不,数据库不会自动执行此操作,并且有充分的理由。它可以防止您破坏数据库并使无效的外键指向不存在的表。一切都表现得像预期的那样。
所以是的,如果要删除表,则需要先删除相关约束。 ON DELETE
外键子句用于删除行,而不是删除表:)