删除表约束问题

时间:2011-12-09 19:07:00

标签: mysql database constraints

我正在创建两个这样的表:

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匹配的行来清空它...

2 个答案:

答案 0 :(得分:1)

删除表与删除行不同,外键约束将级联删除操作,但要实际删除(删除)表,首先需要删除所有外键约束。

答案 1 :(得分:1)

不,数据库不会自动执行此操作,并且有充分的理由。它可以防止您破坏数据库并使无效的外键指向不存在的表。一切都表现得像预期的那样。

所以是的,如果要删除表,则需要先删除相关约束。 ON DELETE外键子句用于删除行,而不是删除表:)