2015-09-29 119 views
0

我有2代表与无法删除一个MySQL表由于外键约束

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 - Cannot delete or update a parent row: a foreign key constraint fails

当我尝试

DROP TABLE cases; 

,因为我已经在projs配置列caseid成为NULL,如果它是引用被删除,这似乎不可思议。我想手动设置这些值来NULL

UPDATE projs SET caseid=NULL; 
DROP TABLE cases; 

,但得到了同样的错误。

任何想法我做错了什么?

回答

4

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

首先,您需要删除projs上的约束条件,即cases,然后您可以放下cases

ON DELETE SET NULL或任何你配置让你说

I've configured the column caseid in projs to become NULL if what it's referencing gets deleted

仅适用于记录cases被删除,而不是整个表。

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

获得的密钥名称