0

キー (文字列) がサードパーティのソースから読み取られる MySQL DB があります。ただし、これらは常に一意であるとは限りません (映画のタイトルです)。したがって、キーの一意性を確認し、一意でない場合は、キーの末尾に増分カウントを追加するなどして、一意になるように修正する必要があります。

これを行うための最良のパターンは何ですか?私は現在、サードパーティから受け取ったすべてのキーを格納し、カウントを格納するテーブルを持っているので、次のようにします:

INSERT INTO MYTABLE(KEY) VALUES(KEY_VAlUE) ON DUPLICATE KEY UPDATE KEY_COUNT = KEY_COUNT + 1

jdbcTemplate と keyHolder を使用して、新しい (または更新された) 行の ID を取得しています。問題は、カウントを戻す必要があることです。もちろん、2 番目のクエリ (SELECT) を実行して、その ID を持つレコードを取得できます。ただし、ここでの問題は並行性にあります。SELECT を実行する直前に、同じサードパーティ キーを使用した別の INSERT が発生する可能性があります (可能性は低いですが)。この場合、カウントが 2 回インクリメントされ、間違ったカウントが返されます。

何か案は?

ありがとうリチャード。

4

4 に答える 4

1

これを行う最善のパターンは、しないことです。このような文字列でテーブルにキーを設定すると、特に衝突が発生することが事前にわかっている場合は、長期的には悲しみ以外の何物でもありません。そうでなければ意味のない自動インクリメントキーを使用してください。必要に応じて、タイトルごとにインデックスを作成することもできます。データを変更する必要はありません。

ちなみに、映画のタイトルの衝突に関しては、映画の年を括弧でくくるのが慣習だと思います。たとえば、「プロデューサー (1968)」と「プロデューサー (2005)」のようになります。

于 2009-09-01T18:48:21.307 に答える
0

システムが任意の行 (最初から一意として送信されていない行) に対して任意の一意のキー値を作成できるようにしている場合は、それを一意に変更する代わりに、 auto を使用して独自の内部代理キーを作成してみませんか? -インクリメント機能(MySQLにはその権利がありますか?)、送信されたキーを一意でない列属性に送信されたとおりに保存します。

すべてのリレーショナル整合性制約には内部代理キーを使用し、他の一意でない要件には送信されたキーのみを使用します...

于 2009-09-01T18:48:04.193 に答える
0

トランザクション。InnoDB を使用してますよね?あなたがする必要があります。

しかし、映画のタイトルは主キーとしては不十分に思えます。自動インクリメント整数などの合成主キーを追加することを検討しましたか?

于 2009-09-01T18:50:10.743 に答える
0

これを行う「パターン」があるかどうかはわかりませんが、単純にトランザクションを使用しないのはなぜですか?

START TRANSACTION;

INSERT INTO MYTABLE(KEY) VALUES(KEY_VAlUE) ON DUPLICATE KEY UPDATE KEY_COUNT = KEY_COUNT + 1;
SELECT KEY_COUNT FROM MYTABLE WHERE KEY=KEY_VALUE;

COMMIT;
于 2009-09-01T18:51:05.310 に答える