web-dev-qa-db-ja.com

外部キーでテーブルを切り捨てる

以下のエラーが発生したテーブルを切り捨てる必要があります。

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
)

外部キーとして機能する子テーブルがあるため、上記を削除できません。

さて、私の質問-キーを削除して無効にするループを通過する代わりに。特定のテーブルを切り捨てて制約を無効にしないにはどうすればよいですか

2
ashanthan r

Oracle 12cが導入されましたTRUNCATE ... CASCADE

切り捨てテーブル

[〜#〜]カスケード[〜#〜]

CASCADEを指定すると、Oracleデータベースは、ON DELETE CASCADE参照制約が有効なテーブルを参照するすべての子テーブルを切り捨てます。これは、指定されたオプションを使用して、すべての子テーブル、グランチャイルドテーブルなどを切り捨てる再帰的な操作です。

これを機能させるには、制約をON DELETE CASCADEに設定する必要があることに注意してください。

12cより前のバージョンでは、はい、ループすることができます。または、TRUNCATEの代わりにDELETEON DELETE CASCADEと一緒に使用できます。

2
Balazs Papp

アシャンサン、FKはデータを保護するために存在します。テーブル間の関係を理解するまで、ターゲットテーブルを切り捨てるべきではありませんでした。また、関連するテーブルを切り捨てて、最終的に再入力する必要がある場合もあります。または、ターゲットテーブルを再ロードし、FKを再検証して、子から無効になった行を削除する必要がある場合があります。アプリケーションの観点からは、ターゲットテーブルの切り捨てが誤りだった可能性もあります。つまり、クリーンアップするのが面倒です。データを置き換える必要があることが判明した場合は、テーブルの最近のエクスポートが存在するかどうかを確認します。幸運を。

0
Mark D Powell