我必须截断一个表,这给了我以下的错误。
ORA-02266:表中由启用的外键引用的唯一/主键。
我通过检查下面的内容来修正,
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无法验证-找不到父键
所以我使用下面的查询来识别子表中的记录,
SELECT DISTINCT column_name FROM schema.table_name2 WHERE column_name NOT IN
(
SELECT column_name FROM schema.table_name1
)我无法删除上面的内容,因为它们有充当外键的子表。
现在我的问题是-而不是循环删除和禁用键。如何截断给定的表而不禁用约束?
发布于 2018-09-27 09:17:34
Oracle12c引入了TRUNCATE ... CASCADE:
如果指定级联,则Oracle数据库将截断所有具有启用的DELETE级联引用约束的引用表的子表。这是一个递归操作,它将使用指定的选项截断所有子表、格兰子表等。
请记住,需要将约束设置为ON DELETE CASCADE才能工作。
在低于12c的版本中,是的,您可以循环通过,也可以代替TRUNCATE使用DELETE和ON DELETE CASCADE,这将花费更长的时间。
发布于 2018-10-01 19:49:47
ashanthan,FK存在以保护数据。在理解表之间的关系之前,不应该截断目标表。您还可能需要截断并最终重新填充相关表。或者,您可能需要重新加载目标表,然后重新验证FK,删除那些不再对子表有效的行。从应用程序的角度来看,也有可能截断目标表是一个错误,这意味着您需要清理一个烂摊子。如果需要替换数据,则检查表最近的导出是否存在。祝好运。
https://dba.stackexchange.com/questions/218688
复制相似问题