如何在 ALTER TABLE 语句中添加“ON DELETE CASCADE”
Posted
技术标签:
【中文标题】如何在 ALTER TABLE 语句中添加“ON DELETE CASCADE”【英文标题】:How to add 'ON DELETE CASCADE' in ALTER TABLE statement 【发布时间】:2010-12-06 23:51:11 【问题描述】:我的表中有一个外键约束,我想在其中添加 ON DELETE CASCADE。
我试过这个:
更改表 child_table_name 修改约束 fk_name 外键(child_column_name) 在删除级联时引用 parent_table_name (parent_column_name);没用。
编辑: 外键已经存在,外键列有数据。
执行语句后得到的错误信息:
ORA-02275: 表中已存在此类引用约束【问题讨论】:
有什么问题?语句被拒绝,删除不发生.. 【参考方案1】:您不能将ON DELETE CASCADE
添加到已经存在的约束中。您将不得不drop
和重新create
约束。 documentation 表示MODIFY CONSTRAINT
子句只能修改state of a constraint(即:ENABLED/DISABLED
...)。
【讨论】:
如果这个答案描述了它是如何完成的而不是指向文档,那将会很有帮助。【参考方案2】:首先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;
【讨论】:
他为我们提供了整个代码,这对于与 postgres 无关的人来说无疑是一个优势 @WiiMaxx 创始人是一个嫉妒的家伙。大声笑这个答案比第一个答案更重要,因为这也提供了代码..【参考方案3】:此 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;
【讨论】:
【参考方案4】:对于任何使用 mysql 的人:
如果您进入您的phpMYADMIN
网页并导航到包含您要更新的外键的表,您所要做的就是单击位于Structure
选项卡中的Relational view
并更改@987654326 @选择菜单选项到Cascade
。
如下图:
【讨论】:
OP 来自 2009 年,其 Oracle 问题已标记,PHPMYADMIN 是 MySQL 的第三方软件组件。 绝对正确。但是我用谷歌搜索了这个问题,想知道如何在 MySQL 中做到这一点,谷歌把我带到了这里。是的,这个问题是用 Oracle 标记的,所以这个答案是不正确的......但它对像我这样偶然发现这个答案的读者很有用。所以它确实 为这个页面增加了价值,即使它不是特定于 Oracle 的。所以,谢谢 James111!【参考方案5】:如前所述:
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;
如您所见,这些命令必须是分开的,先删除再添加。
【讨论】:
这对Oracle无效 刚刚在 SqlServer 中测试过,但您可能不得不像在 postgres 和 SqlServer 本身中那样使用分号go
。但剩下的核心代码是sql标准。用分号测试,我刚改了
[
或 ]
在标准 SQL(和 Oracle)中无效。 Oracle 也不支持外键的 on update
子句。
你说得对,[
]
是特定于 SqlServer 的。我会多清理的。关于on update
我无话可说。【参考方案6】:
这是一个方便的解决方案! 我正在使用 SQL Server 2008 R2。
如果您想通过添加 ON DELETE/UPDATE CASCADE 来修改 FK 约束,请按以下步骤操作:
数字 1:
右击约束,点击修改
2 号:
选择左侧的约束(如果有多个)。然后在右侧,折叠“INSERT And UPDATE Specification”点并指定删除规则或更新规则行上的操作以满足您的需要。之后,关闭对话框。
3 号:
最后一步是保存这些修改(当然!)
PS:当我想修改另一个表中引用的主键时,它让我免于繁重的工作。
【讨论】:
完美,正是我需要的! 不客气@Wildview。很高兴为您提供帮助【参考方案7】:如果您想更改外键而不删除它,您可以这样做:
ALTER TABLE child_table_name WITH CHECK ADD FOREIGN KEY(child_column_name)
REFERENCES parent_table_name (parent_column_name) ON DELETE CASCADE
【讨论】:
【参考方案8】: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;
【讨论】:
欢迎来到 ***。请在***.com/editing-help 了解格式化代码。我为您编辑了代码以使其更具可读性。【参考方案9】: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;
【讨论】:
以上是关于如何在 ALTER TABLE 语句中添加“ON DELETE CASCADE”的主要内容,如果未能解决你的问题,请参考以下文章
alter table 如何删除一列,SQL 中的alter 语句用来删除一张表的一列。具体的句法是啥了?