2017-09-15 9 views
0

ScalaプロジェクトでSlickを使用しています。 Upsert操作(Insert/Update)が必要なモジュールがあります。私たちが知っている方法の1つは、単にSQL文を使用してそれを行うことですが、今のところSlickを使用して代わりにそれを使用したいと考えています。SlickのInsertOrUpdate - プライマリキーを使用しない場合

私たちが使用するSlickのバージョンはInsertOrUpdate()操作をサポートしているので、これを使用します。ここに問題があります: -

テーブルには1つの主キーがあり、これは自動インクリメントに設定されているインデックスです。そして、私たちがしたいupsert操作は、ユニークであることが予想されるが、データベース内で一意または主キーとしてマークされていないトランザクションIDにあります。

このような状況を処理するにはどうすればよいですか?私は手動でテーブルをチェックしてからUpsertを実装しようとしましたが、挿入/更新しましたが、多くのリクエストが1秒ごとに到着し、結果の約1%が2個挿入されている環境では失敗しています。

+0

この純粋なSQLソリューションとは何ですか? – michaJlS

答えて

0

一意のIDを自動生成する場合は、UUIDに行ってください。衝突が実質的に不可能になります。しかし、あなたがそれをしたくないと私には思われます。

その他のオプションは、別のテーブル(transactionId, id)に保存し、そこにtransactionIdをプライマリキーとautoincにすることです。

+0

slickが主キー以外の列をサポートできるような方法はありますか? –

+0

upsertの場合は?そう思わない。私が理解する限り、下線を引いている人は、あなたと同様の解決策を説明しています。https://underscore.io/blog/posts/2015/07/14/upsert.htmlとにかく、それはスリックな問題ではないと思いますが、むしろ古典的な原子性の問題です。 – michaJlS

関連する問題