2009-05-25 11 views
0

を削除します。問題のは、私はいくつかのテーブルを持っているSQLインデックス

  • 表は、すべてではidstructure

idpreffk_idaskfk_idstructure

  • テーブル構造を持つidask
  • テーブル好みにASK idfk_idとの間のユニークなインデックスPREFERENCES(fk_idask,fk_idstructure)の表を参照してください。

    問題は、私はPREFERENCESに2つの行がある場合です。

    `IDPREF` `FK_IDASK` `FK_IDSTRUCTURE` 
    1   1   1 
    2   1   2 
    

    私が反転するようにしたい場合(スイッチ?)好みの間に2つの構造

    `IDPREF` `FK_IDASK` `FK_IDSTRUCTURE` 
    1   1   **2** 
    2   1   **1** 
    

    FK_IDASKFK_IDSTRUCTURE別れるの間に一意のインデックス、ための2つの設定で最初の更新結果と理由同じ構造で同じ質問をする。

    これを防止するために、私はdeleteAndResave関数を作成し、これは今問題を解決します。

    しかし、idassignationfk_idprefのASSIGNATIONテーブルが到着しました。

    ここで、ASSIGNATIONによってリンクされたプリファレンスを削除すると、制約が破損します。

    私はすでに回避策を見つけましたが、醜いです。この問題には何らかの純粋な解決策がありますか?

    ありがとうございます!

    ps。テーブルインデックスととにかく!

    を破る、私はあなたの外部キーが間違った道を指している推測している間に2つの構造体を反転。外部キーがオンになっているように見えます私の悪い英語のため申し訳ありません:(

  • 答えて

    1

    あなたはこの試みることができる:それは一度に実行されるため、「ACID」の「C」(一貫性)は外部キーと一意性は「中に」扱われることを意味しますがなり、今

    UPDATE 
        PREFERENCES 
    SET 
        FK_IDSTRUCTURE = 3 - FK_IDSTRUCTURE 
    

    を前後でOK。

    あなたはより複雑なもの

    UPDATE 
        PREFERENCES 
    SET 
        FK_IDSTRUCTURE = CASE FK_IDSTRUCTURE 
         WHEN 2 THEN 1 WHEN 1 THEN 2 ELSE FK_IDSTRUCTURE END 
    
    +0

    最初の1つはスワップケースのためだけに働く。 (私の実際の言葉の場合、ユーザーは構造を選択することができ、誤って構造を交換することができますが、それはルールではありません)。 ちなみに、少し一般化した2番目の例は動作します...明日は試してみます。 – thebol

    +0

    それは働いた!どうも! – thebol

    -1

    YAH、逢引、そして好みを指す。

    外部キーを設定し、基準逢引にする必要があります。

    別のオプションは、外部キーのDELETE CASCADEオプションをONに考慮することである。これは、あなたが行を削除する場合ことを意味し参照されているテーブルでは、データベースエンジンは自動的にforeig内の関連する行を削除しますnキーテーブル。

    よく使用されるもう1つのオプションは、行を維持するが、無効にすることです。これは、「アクティブビット」列を追加することによって行うことができます。クエリを実行すると、非アクティブとしてマークされた行が除外されます。

    +0

    私は環境設定を変更した場合逢引を削除することができないため、CASE文と文をポン引きすることができます。 割り当てを指す設定について...はいこれが問題を解決します。しかし、反対側では、私は割り当てを削除する場合は、私は環境設定のforeingキーを削除する必要があります(この結果はnullと削除の1つの更新)。私は非常に好きではない – thebol

    関連する問題