首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有外键的截断表

问带有外键的截断表
EN

Database Administration用户
提问于 2018-09-27 04:24:52
回答 2查看 4.6K关注 0票数 2

我必须截断一个表,这给了我以下的错误。

ORA-02266:表中由启用的外键引用的唯一/主键。

我通过检查下面的内容来修正,

代码语言:javascript
复制
SELECT p.table_name "Parent Table", c.table_name "Child Table", 
    p.constraint_name "Parent Constraint", c.constraint_name "Child Constraint" 
    FROM dba_constraints p 
    JOIN dba_constraints c ON(p.constraint_name=c.r_constraint_name) 
    WHERE (p.constraint_type = 'P' OR p.constraint_type = 'U') 
    AND c.constraint_type = 'R' AND p.table_name = UPPER('TABLE_NAME')
    AND p.owner='SCHEMA_NAME'
/

修改表schema.table_name禁用约束SYS_constraint_name;

把桌子截短了。

现在我正在尝试启用约束,但是得到以下内容,

启用约束或02298无法验证-找不到父键

所以我使用下面的查询来识别子表中的记录,

代码语言:javascript
复制
SELECT DISTINCT column_name FROM schema.table_name2 WHERE column_name NOT IN 
(
SELECT column_name FROM schema.table_name1
)

我无法删除上面的内容,因为它们有充当外键的子表。

现在我的问题是-而不是循环删除和禁用键。如何截断给定的表而不禁用约束?

EN

回答 2

Database Administration用户

回答已采纳

发布于 2018-09-27 09:17:34

Oracle12c引入了TRUNCATE ... CASCADE:

截断表

如果指定级联,则Oracle数据库将截断所有具有启用的DELETE级联引用约束的引用表的子表。这是一个递归操作,它将使用指定的选项截断所有子表、格兰子表等。

请记住,需要将约束设置为ON DELETE CASCADE才能工作。

在低于12c的版本中,是的,您可以循环通过,也可以代替TRUNCATE使用DELETE和ON DELETE CASCADE,这将花费更长的时间。

票数 2
EN

Database Administration用户

发布于 2018-10-01 19:49:47

ashanthan,FK存在以保护数据。在理解表之间的关系之前,不应该截断目标表。您还可能需要截断并最终重新填充相关表。或者,您可能需要重新加载目标表,然后重新验证FK,删除那些不再对子表有效的行。从应用程序的角度来看,也有可能截断目标表是一个错误,这意味着您需要清理一个烂摊子。如果需要替换数据,则检查表最近的导出是否存在。祝好运。

票数 0
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/218688

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档