2011-11-17 6 views
0

UIでは、私はaccount_idaccount_nameを表示しています。
ユーザーはaccount_idとaccount_nameを更新することができ、account_idはユーザー固有のものです。 account_id(コンポジット・キー)を更新することをユーザーに許可しているので、更新中にwhere句を作成する方法はありますか?SQL:コンポジットキーを更新するには?

以下は私のテーブルデザインです。

CREATE TABLE accounts (
    user_id  VARCHAR2(20) NOT NULL, 
    account_id VARCHAR2(20) NOT NULL, 
    account_name VARCHAR2(20) NOT NULL 
) 

ALTER TABLE accounts ADD CONSTRAINT 
uk_myTable_1 UNIQUE (User_id, account_id) 
+0

これは機能しますが、私は決して共有または表示されないシーンの背後にある不変のキーです。外部キーの関係や複合キーの一部の更新に関する問題を解消します。(IEはフィールドを追加します(PKのAccountID、FKの関係で使用されます) – xQbert

+0

@OMGPoniesそのOracle ... – james007

+0

思考のためのいくつかの飼料:http://programmers.stackexchange.com/questions/8187/should-a-プライマリキー不変の – xQbert

答えて

3

account_iduser_id値が残ります。

したがって、 account_iduser_id 10と始まり、account_idを30に変更すると、

UPDATE accounts 
    SET account_id = '30' 
    WHERE account_id = '20' 
     AND user_id = '10'; 

あなたの複合キーのすべての値を保持状況のために上記の作品は、私は共有しないか、表示されない舞台裏で不変キーのすべてだものの。これにより、外部キーの関係や複合キーの一部の更新に関する問題が排除されます。これを実装するには、PKでありFK関係で使用されるフィールド(AccountID)を追加します。

また、OracleはROWSCNを使用して、すべての表でステートレス環境の行依存関係を使用して、これに類似した処理を実行できます。 AccountIDだけで、複数のユーザー環境で、人1にレコード1を更新し、ユーザー2にレコード1を編集して保存させることができるということが、アカウントIDだけであれば問題になることはありません。ユーザ1の更新を上書きする。これがROWSCNとROWDEPENDENCIESについて述べた理由です。しかし、あなたが状態を意識した環境にいる場合、これは過度のことです。

最後に、クラスを更新する前に、データベースの更新を実行する操作の順序を変更できます。あなたは両方の値を持っています。

+0

私は場面の裏に不変の鍵を持つあなたの解決が好きです...答えのセクションであなたのポイントを明確にしてください... – james007

0
UPDATE accounts 
SET whatevercolumnsyouwantasnormal 
WHERE USER_ID = 'whatever' and ACCOUNT_ID = 'whatever2' 

これは明らかにあなたがUPDATEを発行するまで(新しいものとは別に)、元USER_IDとACCOUNT_IDを追跡するためにあなたを必要とします。

これがウェブアプリケーションの場合(特に)、ユーザーがこのプロセスを2回連続してトリガーするケースを考慮してください。

また、オラクルのRowIDを参照してください。これをPK列の代わりにWHERE節で使用できます。

+0

アカウントの更新account_id = 'dummy2'(user_id = 'user1'とaccount_id = 'accountid')を設定します。 where句を作成するために古いaccount_idを持っていません... – james007

+0

複合キーを追跡するための、GUIの隠しフィールドです。あなたのクラスを拡張してコンポジットキーの値を保持する必要があるので、where節を作成することができます。 – xQbert

+0

@ james007何とか行を識別する方法を追跡する必要があります。その周りに道はない。 – mjwills

0

これを試してください:あなたがそれらを変更するまで

UPDATE accounts SET account_id = New_account,account_name = new_name 
WHERE user_id = Old_id and account_id = old_account_id 
+0

私はaccount_idを変更しているので、私はold_account_idを維持していません。私は必要に応じてテーブルデザインを変更するのに十分な柔軟性があります....私はold_valuesを追跡する必要がありますか? – james007

+0

元のアカウントIDをどこかに保存しておく必要があります。私は検索キーの古いアカウントIDを使用することを提案しています... – Sparky

+0

彼は彼がDBの更新を行う前に、情報を含むクラスが上書きされることを意味すると思います。代替オプションは、クラスを更新する前にデータベースへのUPDATEを行うことです。 – xQbert

0

SQLの作業単位は列であり行ではありません。

は今実際にこれを実行していないが、ことを考慮してください。

UPDATE accounts 
    SET user_id = account_id, 
     account_id = user_id ; 

が正常にすべてのユーザーに対してuser_idaccount_idを入れ替えます。これは、更新の影響を受けるすべての行(WHERE節で決定される)が一度にすべて更新されるためです。