sql >> データベース >  >> RDS >> Oracle

双方向の依存関係を持つ行を削除するにはどうすればよいですか?

    外部キーはnot nullので、そもそもデータがどのようにしてこの状態になったのか疑問に思う必要があります。 。最初に両方のテーブルが空だった場合、どちらのテーブルにも行を挿入することはできません。

    それを少しの間無視して、シナリオを再作成します。制約を無効にしても問題ありません:

    CREATE TABLE tablea(id NUMBER(19, 0) NOT NULL, 
                        rtablea_id NUMBER(19, 0) NOT NULL, 
                        PRIMARY KEY(id))
    /
    
    CREATE TABLE tableb(id NUMBER(19, 0) NOT NULL, 
                        rtableb_id NUMBER(19, 0) NOT NULL, 
                        PRIMARY KEY(id))
    /
    
    INSERT INTO tablea
    VALUES     (1, 2)
    /
    
    INSERT INTO tableb
    VALUES     (2, 1)
    /
    
    ALTER TABLE tablea ADD CONSTRAINT fka1 
                           FOREIGN KEY (rtablea_id)  
                           REFERENCES tableb
    /
    ALTER TABLE tableb ADD CONSTRAINT fkb1  
                           FOREIGN KEY (rtableb_id)  
                           REFERENCES tablea
    /
    ALTER TABLE tablea MODIFY CONSTRAINT fka1 DISABLE
    /
    ALTER TABLE tableb MODIFY CONSTRAINT fkb1 DISABLE
    /
    delete tablea
    /
    delete tableb
    /
    commit
    /
    

    結果:

    Table created.
    Table created.
    1 row created.
    1 row created.
    Table altered.
    Table altered.
    Table altered.
    Table altered.
    1 row deleted.
    1 row deleted.
    Commit complete.
    

    ORA-02297をどのように入手するかわかりません 外部キーを無効にしようとするとエラーが発生します。このエラーは通常、外部キーが依存する主キーまたは一意キーを無効にするときに発生します。

    あなたが本当にやりたいのは、制約をinitially deferredに設定することだと思います。 。これにより、トランザクションがコミットされる前に対応する行が更新または削除されている限り、各テーブルに対して個別に挿入と削除を実行できます。

    CREATE TABLE tablea(id NUMBER(19, 0) NOT NULL,  
                        rtablea_id NUMBER(19, 0) NOT NULL,  
                        PRIMARY KEY(id))
    /
    
    CREATE TABLE tableb(id NUMBER(19, 0) NOT NULL,  
                        rtableb_id NUMBER(19, 0) NOT NULL,  
                        PRIMARY KEY(id))
    /
    
    ALTER TABLE tablea ADD CONSTRAINT fka1 
                           FOREIGN KEY (rtablea_id) 
                           REFERENCES tableb 
                           INITIALLY DEFERRED
    /
    ALTER TABLE tableb ADD CONSTRAINT fkb1 
                           FOREIGN KEY (rtableb_id) 
                           REFERENCES tablea 
                           INITIALLY DEFERRED
    /
    
    INSERT INTO tablea
    VALUES     (1, 2)
    /
    
    INSERT INTO tableb
    VALUES     (2, 1)
    /
    
    INSERT INTO tableb
    VALUES     (3, 1)
    /
    
    COMMIT
    /
    
    DELETE tableb
    WHERE  id = 2
    /
    
    UPDATE tablea
    SET    rtablea_id   = 3
    WHERE  id = 1
    /
    
    COMMIT
    /
    

    結果:

    Table created.
    Table created.
    Table altered.
    Table altered.
    1 row created.
    1 row created.
    1 row created.
    Commit complete.
    1 row deleted.
    1 row updated.
    Commit complete.
    


    1. クエリでのmysqlの大文字と小文字を区別するテーブル名

    2. 列SQLを動的に作成する

    3. PHPを使用して空のファイルをMySQLdumpしますが、コマンドラインは使用しませんか?

    4. Wordpressmysqlグループby|注文する