由于外键约束,无法删除MySQL表

时间:2015-09-29 19:11:09

标签: mysql sql database-design

我有两张用

创建的表格
CREATE TABLE projs 
(
    id          MEDIUMINT NOT NULL AUTO_INCREMENT PRIMARY KEY, 
    compname    VARCHAR (200), 
    title       VARCHAR (200), 
    imageurl    VARCHAR(300), 
    sumsmall    VARCHAR (250), 
    sumfull     VARCHAR (5000), 
    results     VARCHAR (2000), 
    postdate    TIMESTAMP DEFAULT CURRENT_TIMESTAMP, 
    caseid      MEDIUMINT NULL, 
    hide        TINYINT NOT NULL, 
    carid       MEDIUMINT, 
    FOREIGN KEY (caseid) REFERENCES cases(id) ON DELETE SET NULL, 
    FOREIGN KEY (carid) REFERENCES work_carousels(id) ON DELETE SET NULL
)

CREATE TABLE cases 
(
    id              MEDIUMINT NOT NULL AUTO_INCREMENT PRIMARY KEY, 
    compname        VARCHAR (200), 
    sumsmall        VARCHAR (500), 
    situation       VARCHAR (1000), 
    imageurl        VARCHAR(300), 
    approach        VARCHAR (1000), 
    deliverables    VARCHAR (1000), 
    results         VARCHAR (1000), 
    conclusion      VARCHAR (1000), 
    postdate        DATETIME DEFAULT CURRENT_TIMESTAMP, 
    carid           MEDIUMINT, 
    FOREIGN KEY (carid) REFERENCES work_carousels(id) ON DELETE SET NULL
)

重要的部分是projs中有一列引用cases中的列。我收到错误:

  

#1217 - 无法删除或更新父行:外键约束失败

当我尝试

DROP TABLE cases;

这看起来很奇怪,因为我已将caseid中的列projs配置为NULL,如果它的引用被删除了。我尝试将这些值手动设置为NULL

UPDATE projs SET caseid=NULL;
DROP TABLE cases;

但得到了同样的错误。

知道我做错了吗?

1 个答案:

答案 0 :(得分:3)

您有一个引用要删除的表的约束(外键)。删除表时,约束没有任何意义,因为它引用了无法解析的对象。

首先,您需要删除引用projs的{​​{1}}上的约束,然后您可以删除cases

cases或您配置的任何内容可以说明

  

我已经将projs中的caseidid配置为NULL,如果它引用的内容被删除

仅适用于被删除的ON DELETE SET NULL中的记录,而不适用于整个表格。

要删除外键,您需要使用cases。您需要将ALTER TABLE projs DROP FOREIGN KEY [keyname]替换为您可以从[keyname]

获取的密钥的名称