如何在ALTER TABLE语句中添加“ON DELETE CASCADE”

我在表中有一个外键约束,我想添加ON DELETE CASCADE到它。

我试过这个:

 alter table child_table_name
  修改约束fk_name
  外键(child_column_name)
  在删除级联上引用parent_table_name(parent_column_name);

不起作用。

编辑:
外键已经存在,外键列中有数据。

执行语句后得到的错误消息:

 ORA-02275:表中已经存在这样一个参照约束

您不能将ON DELETE CASCADE添加到已经存在的约束中。 您将不得不drop并重新create约束。 该文档显示MODIFY CONSTRAINT子句只能修改约束的状态 (即: ENABLED/DISABLED …)。

首先drop你的外键,并尝试你的上面的命令,把add constraint而不是modify constraint 。 现在这是命令:

 ALTER TABLE child_table_name ADD CONSTRAINT fk_name FOREIGN KEY (child_column_name) REFERENCES parent_table_name(parent_column_name) ON DELETE CASCADE; 

这个PL * SQL将向DBMS_OUTPUT写入一个脚本,该脚本将删除没有删除级联的每个约束,并使用删除级联重新创build它。

注:运行此脚本的输出是您自己的风险。 最好仔细阅读结果脚本并在执行之前对其进行编辑。

 DECLARE CURSOR consCols (theCons VARCHAR2, theOwner VARCHAR2) IS select * from user_cons_columns where constraint_name = theCons and owner = theOwner order by position; firstCol BOOLEAN := TRUE; begin -- For each constraint FOR cons IN (select * from user_constraints where delete_rule = 'NO ACTION' and constraint_name not like '%MODIFIED_BY_FK' -- these constraints we do not want delete cascade and constraint_name not like '%CREATED_BY_FK' order by table_name) LOOP -- Drop the constraint DBMS_OUTPUT.PUT_LINE('ALTER TABLE ' || cons.OWNER || '.' || cons.TABLE_NAME || ' DROP CONSTRAINT ' || cons.CONSTRAINT_NAME || ';'); -- Re-create the constraint DBMS_OUTPUT.PUT('ALTER TABLE ' || cons.OWNER || '.' || cons.TABLE_NAME || ' ADD CONSTRAINT ' || cons.CONSTRAINT_NAME || ' FOREIGN KEY ('); firstCol := TRUE; -- For each referencing column FOR consCol IN consCols(cons.CONSTRAINT_NAME, cons.OWNER) LOOP IF(firstCol) THEN firstCol := FALSE; ELSE DBMS_OUTPUT.PUT(','); END IF; DBMS_OUTPUT.PUT(consCol.COLUMN_NAME); END LOOP; DBMS_OUTPUT.PUT(') REFERENCES '); firstCol := TRUE; -- For each referenced column FOR consCol IN consCols(cons.R_CONSTRAINT_NAME, cons.R_OWNER) LOOP IF(firstCol) THEN DBMS_OUTPUT.PUT(consCol.OWNER); DBMS_OUTPUT.PUT('.'); DBMS_OUTPUT.PUT(consCol.TABLE_NAME); -- This seems a bit of a kluge. DBMS_OUTPUT.PUT(' ('); firstCol := FALSE; ELSE DBMS_OUTPUT.PUT(','); END IF; DBMS_OUTPUT.PUT(consCol.COLUMN_NAME); END LOOP; DBMS_OUTPUT.PUT_LINE(') ON DELETE CASCADE ENABLE VALIDATE;'); END LOOP; end; 

如前所述:

 ALTER TABLE TABLEName drop CONSTRAINT FK_CONSTRAINTNAME; ALTER TABLE TABLENAME ADD CONSTRAINT FK_CONSTRAINTNAME FOREIGN KEY (FId) REFERENCES OTHERTABLE (Id) ON DELETE CASCADE ON UPDATE NO ACTION; 

正如你可以看到那些必须被分离的命令,首先删除然后添加。

对于任何使用MySQL的人:

如果进入PHPMYADMIN网页并导航到具有要更新的外键的表,则只需单击“ Structure选项卡中的“ Relational view ,然后将“ On deleteselect”菜单选项更改为“ Cascade

图像如下所示:

在这里输入图像说明