如何在 ALTERTABLE 语句中添加“ ONDELETECASCADE”

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

我试过这个:

alter table child_table_name
modify constraint fk_name
foreign key (child_column_name)
references parent_table_name (parent_column_name) on delete cascade;

没用的。

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

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

ORA-02275: such a referential constraint already exists in the table
315811 次浏览

不能将 ON DELETE CASCADE添加到已存在的约束中。您将不得不重新 dropcreate的约束。文件表明 MODIFY CONSTRAINT子句只能修改 约束的状态(i-e: 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 写入一个脚本,该脚本将删除每个没有删除级联的约束,并使用删除级联重新创建它。

注意: 运行此脚本的输出将由您自己承担风险。最好在执行之前阅读并编辑结果脚本。

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;

对于任何使用 MySQL 的人:

如果你进入你的 PHPMYADMIN网页并且导航到有你想要更新的外键的表格,你所要做的就是点击位于 Structure选项卡中的 Relational view 并且改变 On delete选择菜单选项为 Cascade

图片如下:

enter image description here

如前所述:

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;

正如您可以看到的那样,这些命令必须是分开的,首先是删除,然后是添加。

这里有一个方便的解决办法! 我使用的是 SQLServer2008R2。

当您希望通过添加 ON DELETE/UPDATE CASCADE 来修改 FK 约束时,请遵循以下步骤:

第一:

右键单击约束并单击 修改

enter image description here

第二:

在左侧选择约束(如果有多个约束)。然后在右侧折叠“ 插入和更新规范”点,并指定“删除规则”或“更新规则”行上的操作,以满足您的需要。之后,关闭对话框。

enter image description here

第三:

最后一步是保存这些修改(当然!)

enter image description here

PS: 它让我省去了一大堆工作,因为我想修改另一个表中引用的主键。

如果您想更改一个外键而不丢弃它,您可以这样做:

ALTER TABLE child_table_name  WITH CHECK ADD FOREIGN KEY(child_column_name)
REFERENCES parent_table_name (parent_column_name) ON DELETE CASCADE

对于 MYSQL 用户的回答:

ALTER TABLE ChildTableName
DROP FOREIGN KEY `fk_table`;
ALTER TABLE ChildTableName
ADD CONSTRAINT `fk_t1_t2_tt`
FOREIGN KEY (`parentTable`)
REFERENCES parentTable (`columnName`)
ON DELETE CASCADE
ON UPDATE CASCADE;
ALTER TABLE `tbl_celebrity_rows` ADD CONSTRAINT `tbl_celebrity_rows_ibfk_1` FOREIGN KEY (`celebrity_id`)
REFERENCES `tbl_celebrities`(`id`) ON DELETE CASCADE ON UPDATE RESTRICT;

工作台 右键单击要更改的表,然后单击“更改表”,再单击“外键”。您可以看到右侧的外键选项,只需选择级联,然后单击应用!

后遗症

BEGIN TRANSACTION ;
ALTER TABLE bank_accounts
DROP CONSTRAINT bank_accounts_company_id_fkey;


ALTER TABLE bank_accounts
ADD CONSTRAINT bank_accounts_company_id_fkey FOREIGN KEY (company_id)
REFERENCES companies (id)
ON DELETE CASCADE;
END;