【问题标题】:Can't delete data that has multiple Foreign Keys无法删除具有多个外键的数据
【发布时间】:2017-10-24 22:31:39
【问题描述】:

这些是我的桌子:

CREATE TABLE COACH (
  COACH_ID  VARCHAR(8),
  COACH_NAME    VARCHAR(50),
  COACH_ADD VARCHAR(100),
  COACH_PHONENO CHAR(12),
  PRIMARY KEY (COACH_ID));

CREATE TABLE TEAM (
  TEAM_ID       VARCHAR(8),
  COACH_ID  VARCHAR(8),
  TEAM_NAME VARCHAR(50),
  TEAM_COLOUR   VARCHAR(10),
  PRIMARY KEY (TEAM_ID),
  CONSTRAINT TEAM_COACH_ID_FK 
  FOREIGN KEY (COACH_ID) REFERENCES COACH);

CREATE TABLE PARTICIPANT (
  PART_ID       VARCHAR(8),
  TEAM_ID       VARCHAR(8),
  SPORT_NAME    VARCHAR(15),
  PART_NAME VARCHAR(50),
  PART_IC       VARCHAR(14),
  PART_PHONENO  CHAR(12),
  PRIMARY KEY (PART_ID),
  CONSTRAINT SPORT_TEAM_ID_FK
  FOREIGN KEY (SPORT_NAME) REFERENCES SPORT,
  CONSTRAINT TEAM_TEAM_ID_FK
  FOREIGN KEY (TEAM_ID) REFERENCES TEAM );

这是我的 SQL:

DELETE FROM TEAM 
WHERE TEAM_COLOUR='Magenta';

代码产生了这个错误:

错误报告:
SQL 错误:ORA-02292:违反完整性约束 (HR.TEAM_TEAM_ID_FK) - 找到子记录
02292. 00000 - “违反完整性约束 (%s.%s) - 找到子记录”
*原因:试图删除具有外部依赖关系的父键值。 *操作:先删除依赖项,然后删除父项或禁用约束。

我想DELETE TEAM_COLOUR = 'MAGENTA'

【问题讨论】:

  • 然后,首先从参与者中删除团队中所有首先具有 team_color magenta 的参与者。或者启用级联删除。
  • 我可以在单个查询中做到这一点吗?
  • 不。您首先必须通过更改 DDL 来启用级联删除,然后再删除,否则您必须运行两个删除语句。
  • 如何启用级联删除?
  • 参见此处:stackoverflow.com/questions/1571581/… 您必须先删除现有约束,然后在启用级联删除的情况下将其添加回来。

标签: sql


【解决方案1】:

首先删除所有 Team_Colour='Magenta' 团队成员的所有参与者。

然后你就可以删除团队了。

【讨论】:

  • 这意味着我需要做多个查询?
  • 是的。恐怕是的。
【解决方案2】:

可能是这样的:

语法有效:但仍然不确定这是否适合您...

但请注意;级联删除可能很危险。如果你不小心删除了一个团队,你也会丢失所有的参与者信息......这就是为什么很多人喜欢做两个删除语句的原因。

ALTER TABLE PARTICIPANT
  DROP CONSTRAINT TEAM_TEAM_ID_FK;

ALTER TABLE PARTICIPANT
  ADD CONSTRAINT TEAM_TEAM_ID_FK
  FOREIGN KEY (TEAM_ID) 
  REFERENCES TEAM(TEAM_ID) 
  ON DELETE CASCADE;

然后

DELETE FROM TEAM WHERE TEAM_COLOUR='Magenta';

应该可以。

这是整个脚本:

CREATE TABLE COACH (
  COACH_ID  VARCHAR(8),
  COACH_NAME    VARCHAR(50),
  COACH_ADD VARCHAR(100),
  COACH_PHONENO CHAR(12),
  PRIMARY KEY (COACH_ID));

CREATE TABLE TEAM (
  TEAM_ID       VARCHAR(8),
  COACH_ID  VARCHAR(8),
  TEAM_NAME VARCHAR(50),
  TEAM_COLOUR   VARCHAR(10),
  PRIMARY KEY (TEAM_ID),
  CONSTRAINT TEAM_COACH_ID_FK 
  FOREIGN KEY (COACH_ID) REFERENCES COACH);

CREATE TABLE PARTICIPANT (
  PART_ID       VARCHAR(8),
  TEAM_ID       VARCHAR(8),
  SPORT_NAME    VARCHAR(15),
  PART_NAME VARCHAR(50),
  PART_IC       VARCHAR(14),
  PART_PHONENO  CHAR(12),
  PRIMARY KEY (PART_ID),
  CONSTRAINT TEAM_TEAM_ID_FK
  FOREIGN KEY (TEAM_ID) REFERENCES TEAM );

  insert into coach values (1,'Test1',NULL,NULL);
  Insert into Team values (1,1,'Test1','Blue');
  insert into team values (2,1,'Test1','Magenta');
  Insert into Participant (part_ID, Team_ID) values (1,1);
  Insert into Participant (part_ID, Team_ID) values (2,1);
  Insert into Participant (part_ID, Team_ID) values (3,2);

ALTER TABLE PARTICIPANT DROP Constraint TEAM_TEAM_ID_FK;

ALTER TABLE PARTICIPANT
  ADD CONSTRAINT TEAM_TEAM_ID_FK
  FOREIGN KEY (TEAM_ID) 
  REFERENCES TEAM(TEAM_ID) 
  ON DELETE CASCADE;
  DELETE FROM TEAM WHERE TEAM_COLOUR='Magenta';

【讨论】:

  • 更改表 tbl_magazine_issue 表团队?
  • 糟糕。复制和粘贴错误。仍在测试我已更正
  • #CODING ALTER TABLE TEAM DROP FOREIGN KEY TEAM_TEAM_ID_FK; ALTER TABLE PARTICIPANT ADD CONSTRAINT TEAM_TEAM_ID_FK FOREIGN KEY (TEAM_ID) REFERENCES TEAM(TEAM_ID) ON DELETE CASCADE; #ERROR ALTER TABLE PARTICIPANT ADD CONSTRAINT TEAM_TEAM_ID_FK FOREIGN KEY (TEAM_ID) REFERENCES TEAM(TEAM_ID) ON DELETE CASCADE 错误报告:SQL 错误:ORA-02275:这样的参照约束已经存在于表中“这样的参照约束已经存在于表中" *原因:不言而喻。 *行动:删除额外的约束。
  • 你为什么要换桌队?您需要更改示例中 Team 是 FK(参与者)的表。
  • 你没有从参与者表中删除约束......你从团队中删除了它......ALTER TABLE TEAM DROP FOREIGN KEY TEAM_TEAM_ID_FK; 是错误的 ALTER TABLE PARTICIPANT DROP FOREIGN KEY TEAM_TEAM_ID_FK; 是正确的。
猜你喜欢
  • 2014-06-20
  • 2015-05-31
  • 1970-01-01
  • 2017-03-14
  • 1970-01-01
  • 2019-10-10
  • 2014-02-09
  • 1970-01-01
  • 2011-08-01
相关资源
最近更新 更多