以下のエラーが発生したテーブルを切り捨てる必要があります。
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を無効にします。
テーブルを切り捨てました。
今、私は制約を有効にしようとしていますが、以下を得ています、
enable制約ora-02298は検証できません-親キーが見つかりません
だから私は以下のクエリを使用して子テーブルのレコードを識別し、
SELECT DISTINCT column_name FROM schema.table_name2 WHERE column_name NOT IN
(
SELECT column_name FROM schema.table_name1
)
外部キーとして機能する子テーブルがあるため、上記を削除できません。
さて、私の質問-キーを削除して無効にするループを通過する代わりに。特定のテーブルを切り捨てて制約を無効にしないにはどうすればよいですか
Oracle 12cが導入されましたTRUNCATE ... CASCADE
:
[〜#〜]カスケード[〜#〜]
CASCADEを指定すると、Oracleデータベースは、ON DELETE CASCADE参照制約が有効なテーブルを参照するすべての子テーブルを切り捨てます。これは、指定されたオプションを使用して、すべての子テーブル、グランチャイルドテーブルなどを切り捨てる再帰的な操作です。
これを機能させるには、制約をON DELETE CASCADE
に設定する必要があることに注意してください。
12cより前のバージョンでは、はい、ループすることができます。または、TRUNCATE
の代わりにDELETE
をON DELETE CASCADE
と一緒に使用できます。
アシャンサン、FKはデータを保護するために存在します。テーブル間の関係を理解するまで、ターゲットテーブルを切り捨てるべきではありませんでした。また、関連するテーブルを切り捨てて、最終的に再入力する必要がある場合もあります。または、ターゲットテーブルを再ロードし、FKを再検証して、子から無効になった行を削除する必要がある場合があります。アプリケーションの観点からは、ターゲットテーブルの切り捨てが誤りだった可能性もあります。つまり、クリーンアップするのが面倒です。データを置き換える必要があることが判明した場合は、テーブルの最近のエクスポートが存在するかどうかを確認します。幸運を。