前提として、一意列は一意制約を掛けている事とする。 public object InsertUnique( object 一意キー ) { // 重複チェック bool exists = exec( "SELECT 1 FROM [テーブル] WHERE [一意列]=一意キー" ); if( exists ) return 一意キー; // 既に在るので終わり try { // 無かったので挿入 exec( "INSERT [テーブル] ([一意列]) VALUES (一意キー)" ); } catch( SqlException ex ) { if( ex.Number == 1 ) { // 一意制約による例外なので、もう一度重複チェック bool exists = exec( "SELECT 1 FROM [テーブル] WHERE [一意列]=一意キー" ); if( exists ) return 一意キー; } throw; } }
SQL Server の 2005 までには、ある列に対して一意にレコードを挿入したり更新したりといった操作がアトミックに提供されていない。
なので、取り敢えず挿入前に一意キーを条件に重複チェックを行い、無ければ直後に挿入という策をとる。
はじめから挿入を行い、一意制約違反が起きたら終わりにしてしまっても良いかも知れないが、異常系処理を正常フローに含めるのもどうかと思う。 |
| ホーム |
|