Mysql问题与外键和删除级联有关

时间:2015-10-05 18:20:30

标签: mysql sql database foreign-keys primary-key

我有4个sql表。

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;
  

错误1451(23000):无法删除或更新父行:异类   密钥约束失败(testapplied,CONSTRAINT applied_ibfk_2   外键(jcode)RE FERENCES company_jobsjcode))

如果有人可以,请帮帮我。谢谢

2 个答案:

答案 0 :(得分:1)

从应用于company_job的表中指向的第一个外键没有任何级联规则,因此它可以简单地阻止从company_job中删除;

请参阅mysql dump bellow

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';

答案 1 :(得分:1)

创建applied表时,您创建了2个外键。

之后,您在此表中添加了2个其他外键。

如您所见,该错误引用了一个名为applied_ibfk_2的外键,该外键不是您在创建后添加的外键。

因此,在该表上有4个外键约束的那一刻。

所以,你必须删除在创建表时创建的2个外键(具有预定义的名称),一切都会正常工作