如何在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 delete
select”菜单选项更改为“ Cascade
。
图像如下所示: