2009-09-01 8 views
0

私は、キー(文字列)が第3のparyソースから読み込まれるMySQL DBを持っています。ただし、これらは必ずしも一意に保証されているわけではありません(映画タイトル)。だから私はキーの一意性をチェックする必要があります。ユニークでない場合は、キーの最後にインクリメンタルカウントを追加するなどしてユニークにします。MySQL鍵の一意性の保証

これを行うにはどのようなパターンが最適ですか?私は現在、サードパーティや店舗カウントから受け取ったすべてのキーを格納するテーブルを持っているので、私はやる:私は新しい(または更新)行のIDを取得するためにjdbcTemplateやキーホルダーを使用しています

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

。問題は、私もカウントを取り戻す必要があるということです。もちろん、そのIDでレコードを取得するために2番目のクエリ(SELECT)を実行できます。しかし、ここでの問題は並行性です。同じセカンダリ・キーを持つ別のINSERTが、SELECTを実行する直前に発生する可能性はありますが、(可能性は低いですが)可能です。この場合、カウントは2回目に増加し、間違ったカウントが返されます。

アイデア?

リチャードに感謝します。

答えて

0

システムがANY行(最初に固有のものとして送信されないもの)の任意の一意のキー値を作成できるようにする場合は、それを一意に変更するのではなく、独自の内部サロゲートキーを使用して自動インクリメント機能を使用して(MySQLはそうですか?)、非ユニークな列属性でサブミットされたキーを保存します。

はこれを行うための最善のパターンがしない...

1

をすべてのリレーショナル整合性制約のために内部代理キーを使用して、唯一の他の非固有の要件のために提出したキーを使用します。このような文字列でテーブルをキーイングすると、特に衝突が発生することを事前に知っている場所では、長期的には悲しみ以外は何も起こりません。そうでなければ無意味な自動インクリメントキーを使用してください。必要に応じてタイトルで索引を付けることもできますし、データを狂わせる必要もありません。

ちなみに、映画タイトルの衝突については、映画の年を括弧で括っていると思います。 "生産者(1968年)"と "生産者(2005年)"

+0

ハイトム。はい、私は理想的ではありません。私がそれをしたい理由は、人間が読める素晴らしいURLを持っているからです。タイトルはhttp://mysite.com/The_ProducersのようにURLに変換されます。 "The_Producers"は私のユニークなDBキーで、正しい映画情報をDBからextrcatするのに使われます。ありがとうございました。 –

+0

URLは主キーと何が関係していますか?接続する必要はありません。 –

0

トランザクション。あなた、InnoDBを使用しています。あなたはすべきです。

しかし、映画のタイトルは私にとって貧弱な主キーのように聞こえる。自動インクリメントの整数など、synthetic primary keyを追加することを検討しましたか?

+0

こんにちは。はい、InnoDBを使用しています。トランザクション性は、おそらく私が行くだろう。タイトル以外のものをキーとして使用したいと思いますが、http://mysite.com/my_movie_titleのようにしたいので、 "my_movie_title"は必ずキーです。提案に感謝します。 –

+0

タイトルは*プライマリキーでなくても一意のキーにすることができます。いずれにしても、そのURLスタイルは美しいですが、ムービータイトルを変更/修正する必要がある場合は、すべての古い参照とURLが破損します。 dupeムービータイトルが一般的であれば(おそらくデータベースが十分に大きい)、とにかく 'my_movie_title-12'になります。その時点で、ID-and-slugスタイルのmysite.com/1234/ my_movie_titleはあまりにも不利には見えません。 – bobince

+0

ええ、私はあなたが正しいかもしれないと思います。 probで一意の保証されたキー/ idをタイトルでエンコードするのが最も簡単です。 –

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; 
+0

こんにちはZombat。あなたの提案をありがとう、私はこれを行うための最善の方法だと思う。乾杯。 –

関連する問題