- PR -

重複したレコードを作りたくない場合のInsertについて

投稿者投稿内容
未記入
会議室デビュー日: 2008/05/02
投稿数: 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.トランザクションコミット

------------------------------------------

以上、よろしくお願い致します。
末記人
大ベテラン
会議室デビュー日: 2005/12/05
投稿数: 233
お住まい・勤務地: あわにこ
投稿日時: 2008-05-02 21:34
こんばんは

1の前にテーブルをロックするか、連番管理用のテーブルを作成するのはいかがでしょう?

条件により重複が可能というのがよくわかりませんが、帳票などのデータで、同じで連番で複数レコードがある場合があるとかなのでしょうかね?

その場合は帳票の親データ、子データのようになるようにするのが普通だと思います。
たぶん...
甕星
ぬし
会議室デビュー日: 2003/03/07
投稿数: 1185
お住まい・勤務地: 湖の見える丘の上
投稿日時: 2008-05-02 21:55
最初のSelectは不要です。

複数登録してはならないなら、テーブル定義で一意制約をおこないましょう。
そして、Insert文実行。一意制約エラーならUpdate文を実行。

一意制約をかけられないなら、
Update文実行。更新レコード数が0ならInsert文実行。(要テーブルロック)
GENZO
大ベテラン
会議室デビュー日: 2003/11/26
投稿数: 111
お住まい・勤務地: 名古屋
投稿日時: 2008-05-02 23:06
後勝ちになりますが、deleteしてからinsertではだめでしょうか?
七味唐辛子
ぬし
会議室デビュー日: 2001/12/25
投稿数: 660
投稿日時: 2008-05-02 23:43
引用:

GENZOさんの書き込み (2008-05-02 23:06) より:
後勝ちになりますが、deleteしてからinsertではだめでしょうか?



普通はしないでしょう 
indigo-x
大ベテラン
会議室デビュー日: 2008/02/21
投稿数: 207
お住まい・勤務地: 太陽の塔近く
投稿日時: 2008-05-03 09:39
引用:

七味唐辛子さんの書き込み (2008-05-02 23:43) より:
引用:

GENZOさんの書き込み (2008-05-02 23:06) より:
後勝ちになりますが、deleteしてからinsertではだめでしょうか?



普通はしないでしょう 



今回の場合なら、私には別にイイよな感じがしますが。。

案@1.selectで更新ロックする
案Adelete後insertでもよいのでは
 (insertで失敗する可能性があるので
   deleteからリトライする必要があるかも)

A案の方がよい気がしますが。。。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2008-05-04 01:13
引用:

七味唐辛子さんの書き込み (2008-05-02 23:43) より:

普通はしないでしょう 


トランザクションとの組み合わせで私もたまにやります。 すんまそん。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
Error401
常連さん
会議室デビュー日: 2007/03/12
投稿数: 39
投稿日時: 2008-05-04 02:36
deleteしてinsert方式は、同時に2レコードinsertされる可能性がある問題が依然として残るのでは?

スキルアップ/キャリアアップ(JOB@IT)