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

Ula*_*kar 111 sql oracle

我的表中有一个外键约束,我想向它添加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

Vin*_*rat 138

您无法添加ON DELETE CASCADE到已存在的约束.你将不得不drop重新create约束.该文件显示,该MODIFY CONSTRAINT子句只能修改一个约束的状态(即:ENABLED/DISABLED...).

  • 如果这个答案描述了它是如何完成的而不是指向文档,那将会很有帮助。 (18认同)

小智 69

首先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;
Run Code Online (Sandbox Code Playgroud)

  • 他为我们提供了完整的代码,对于与postgres无关的人来说,这是一个很好的优势 (23认同)
  • @WiiMaxx 创始人是个嫉妒的家伙。哈哈,这个答案比第一个答案更重要,因为它也提供了代码。 (4认同)

小智 22

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;
Run Code Online (Sandbox Code Playgroud)


Ser*_*iko 11

这是一个方便的解决方案!我正在使用 SQL Server 2008 R2。

由于您想要通过添加 ON DELETE/UPDATE CASCADE 来修改 FK 约束,请按照以下步骤操作:

1号:

右键单击约束并单击修改

在此输入图像描述

2号:

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

在此输入图像描述

第三:

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

在此输入图像描述

PS:它使我免于大量工作,因为我想修改另一个表中引用的主键。


shi*_*igo 9

此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;
Run Code Online (Sandbox Code Playgroud)


Dav*_*era 6

如前所述:

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;
Run Code Online (Sandbox Code Playgroud)

正如你所看到的那些必须是分开的命令,首先删除然后添加.


Jam*_*111 5

对于任何使用 MySQL 的人:

如果你的头到你的PHPMYADMIN网页,并导航到具有要更新外键,所有你所要做的就是点击表Relational view 地处Structure选项卡并更改On delete选择菜单选项Cascade

如下图所示:

在此处输入图片说明

  • 绝对真实。但是我用谷歌搜索了这个问题,想知道如何在 MySQL 中做到这一点,谷歌把我带到了这里。是的,这个问题是用 Oracle 标记的,所以这个答案是不正确的……但它对像我这样偶然发现这个答案的读者很有用。所以它*确实*为这个页面增加了价值,即使它不是特定于 Oracle 的。所以,谢谢 James111! (7认同)