【问题标题】:Drop able contraint issue删除表约束问题
【发布时间】:2011-12-10 03:10:05
【问题描述】:

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

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;

当ABC中的一行被删除时,它应该告诉mysql自动从DEF中删除相应的行。

但这不适用于 DROP 操作。 如果我尝试删除表 abc,我会收到一条错误消息,指出外键约束失败。 看来我需要先放下DEF,然后才能放下ABC。我不明白为什么,因为放弃 ABC 也应该自动放弃 DEF,对吧?或者至少通过从 ABC 中删除与 id 匹配的行来清空它...

【问题讨论】:

    标签: mysql database constraints


    【解决方案1】:

    不,数据库不会自动执行此操作,这是有充分理由的。它可以防止您损坏数据库并让无效的外键指向不存在的表。一切都按预期运行。

    所以是的,如果你想删除表,你需要先删除依赖约束。 ON DELETE 外键子句用于删除行时,而不是删除表:)

    【讨论】:

    • @Alex,不,恐怕不是。在删除表之前,您可以删除约束并删除表(但这可能会给您留下毫无意义的数据),或者在执行DROP 之前先删除任何匹配的行。这使一切都处于一致的状态。
    • 如果您尝试使用脚本删除表,您也可以使用 "SET foreign_key_checks = 0; ; SET foreign_key_checks = 1;"
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-11
      • 1970-01-01
      • 2021-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多