- - PR -
重複したレコードを作りたくない場合のInsertについて
1|2|3
次のページへ»
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2008-05-02 20:56
こんにちは、
・C# ・SQLServer2005 で開発を行っております。 データを登録時に、 同じ値のレコード(※1)ある場合はUpdateを行い、 ない場合はInsertを行いたいのですが、 いいやり方が浮かばなくて困っております…。 (※1)同じ値のレコードは条件によっては出来てもよいため プライマリキーにはできません。 データ登録前にSelectを行い、 結果によりInsertかUpdateとやると、 2台の端末から同時に登録された場合に タイミングにより、2件Insertされてしまいます。 流れは下記のようになります。 ------------------------------------------ 1.同じ値がないかSelect 2.同じ値がない場合は、PKとなる値を採番 同じ値がある場合は、SelectしたレコードのPKを格納 3.トランザクション開始 4.1の結果によりInsert、またはUpdate 5.トランザクションコミット ------------------------------------------ 以上、よろしくお願い致します。 | ||||||||
|
投稿日時: 2008-05-02 21:34
こんばんは
1の前にテーブルをロックするか、連番管理用のテーブルを作成するのはいかがでしょう? 条件により重複が可能というのがよくわかりませんが、帳票などのデータで、同じで連番で複数レコードがある場合があるとかなのでしょうかね? その場合は帳票の親データ、子データのようになるようにするのが普通だと思います。 たぶん... | ||||||||
|
投稿日時: 2008-05-02 21:55
最初のSelectは不要です。
複数登録してはならないなら、テーブル定義で一意制約をおこないましょう。 そして、Insert文実行。一意制約エラーならUpdate文を実行。 一意制約をかけられないなら、 Update文実行。更新レコード数が0ならInsert文実行。(要テーブルロック) | ||||||||
|
投稿日時: 2008-05-02 23:06
後勝ちになりますが、deleteしてからinsertではだめでしょうか?
| ||||||||
|
投稿日時: 2008-05-02 23:43
普通はしないでしょう | ||||||||
|
投稿日時: 2008-05-03 09:39
今回の場合なら、私には別にイイよな感じがしますが。。 案@1.selectで更新ロックする 案Adelete後insertでもよいのでは (insertで失敗する可能性があるので deleteからリトライする必要があるかも) A案の方がよい気がしますが。。。 | ||||||||
|
投稿日時: 2008-05-04 01:13
トランザクションとの組み合わせで私もたまにやります。 すんまそん。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||
|
投稿日時: 2008-05-04 02:36
deleteしてinsert方式は、同時に2レコードinsertされる可能性がある問題が依然として残るのでは?
|
1|2|3
次のページへ»