2015-10-05 74 views
0

我有4個sql表。有關外鍵和刪除級聯的Mysql問題

create table general(regno int NOT NULL primary key); 

create table company_information(cregno int NOT NULL primary key); 

create table company_jobs (jcode int NOT NULL primary key, cregno int , foreign key(cregno) references company_information(cregno)); 

create table applied(cregno int ,jcode int, regno int, foreign key(regno) references general(regno), foreign key(jcode) references company_jobs(jcode)); 

我需要做的就是從表格company_jobs中刪除表格應用有一定的價值。實際上,從表格結構中可以看出,所有表格都必須具有適用於表格的某些值。 我用這些命令來添加ON DELETE CASCADE約束:

alter table company_jobs add constraint fk_cregno13 foreign key(cregno) references company_information (cregno) on delete cascade; 

alter table applied add constraint fk_jcode16 foreign key(jcode) references company_jobs(jcode) on delete cascade; 

alter table applied add constraint fk_regno14 foreign key(regno) references general(regno) on delete cascade; 

但它不是不幸工作,我收到的時候我給下面的命令此錯誤。

mysql> delete from company_jobs; 

ERROR 1451(23000):無法刪除或更新父行,外 鍵constrai NT失敗(testapplied,約束applied_ibfk_2 外鍵(jcode)RE FERENCES company_jobsjcode))

請幫助我,如果任何人都可以。謝謝

回答

0

當你創建你創建2外商applied表鍵。

之後,您已經爲此表添加了2個其他外鍵。

正如您所看到的,錯誤引用了一個名爲applied_ibfk_2的外鍵,它不是您在創建之後添加的外鍵。

因此,當你在該表上有4個外鍵約束時。

所以,你不得不放棄對錶創建創建2個外鍵(有一個預定義的名稱),一切都將工作

+0

這工作。謝謝 –

0

從應用於company_job的表中指向的第1個外鍵沒有任何級聯規則,因此它簡單地阻止了從company_job中刪除;

見MySQL的轉儲波紋管

ALTER TABLE `applied` 
    ADD CONSTRAINT `applied_ibfk_1` FOREIGN KEY (`regno`) REFERENCES `general` (`regno`), 
    ADD CONSTRAINT `applied_ibfk_2` FOREIGN KEY (`jcode`) REFERENCES `company_jobs` (`jcode`), 
    ADD CONSTRAINT `fk_jcode16` FOREIGN KEY (`jcode`) REFERENCES `company_jobs` (`jcode`) ON DELETE CASCADE, 
    ADD CONSTRAINT `fk_regno14` FOREIGN KEY (`regno`) REFERENCES `general` (`regno`) ON DELETE CASCADE; 

您需要先刪除外鍵,或重新創建表,而第一外鍵

ALTER TABLE 'applied' DROP CONTRAINT 'applied_ibfk_2'; 
+0

這個工作。謝謝 –