2016-12-23 1 views
1

私はAzure SQLデータベース(Microsoft SQL Azure(RTM) - 12.0.2000.8 Dec 5 2016 21:15:30)を使用していて、重複レコードを取得しないようにテーブル(チャット)を設定しようとしています。テーブルの構造は次のとおりです。重複レコードを入力しないようにテーブルを設定/構成するにはどうすればよいですか。

Chart_ID  Primary Key (Identity Key) 
Chart_Date Date 
Chart_Code VarChar (This is a unique value) 
Chart_Value Int 

私は、新しいクエリの場合は更新または挿入を使用しています。私は以下のレコードアップサート場合

1, 2016-12-10, 12Dec10-00TAM00, 10 

:データベース

0, 2016-12-10, 12Dec10-00TAM00, 10 (Note I use a zero for the primary key so the database will assign the correct primary key) 

を= 2 Chart_Idで新しいレコードを挿入しますが、私はそれを望んでいない現在、テーブルには、次の記録を持っていますに。私にとってこれは重複した記録です。

また、私は少しの研究を行い、独自の制約に関する情報を見つけました。

私は私がいない重複レコードの目標を達成するためのベストプラクティスは何

Use TestDB; 
Go 
Alter Table CHART 
ADD CONSTRAINT AK_UNIQUECHART_CODE UNIQUE (CHART_CODE); 

のような何かができると信じていたものから。

ありがとうございます。

答えて

1

Sam Saffron's upsert methodのバージョンを使用できます。あなたが使用している場合を除き、本当にあなたの主キーは、ある

create procedure dbo.Chart_upsert (
    @Chart_ID int   /* not used in this draft */ 
    , @Chart_Date date 
    , @Chart_Code varchar(32) 
    , @Chart_Value int 
) as 
begin 
    set nocount on; 
    set xact_abort on; 
    begin tran 
    update dbo.Chart with (serializable) 
     set Chart_Value = @Chart_Value 
     where Chart_Code = @Chart_Code 
    if @@rowcount = 0 
    begin; 
     insert dbo.Chart (Chart_Date, Chart_Code, Chart_Value) 
     values (@Chart_Date, @Chart_Code, @Chart_Value); 
    end; 
    commit tran 
end; 
1

さて、ここで不足している情報の少しがあるが、それはあなたのチャートのコードのように聞こえる:

ラフ案は次のようになります何かを代弁する。もし、チャートコードがルックアップ列であれば、クラスター化されていないユニークなインデックスもそこに追加することができます。

ユニーク制約を使用してプライマリキーを変更したり、ユニーク制約を使用したり、クラスタ化されていないユニークインデックスを使用すると、ユニーク制約を作成する場合と同様の影響が挿入に発生しますこのような状況では、索引が問合せ計画に影響を与える可能性があるため、検索パターンがどのようなものかわからなくても、これらの方法のいずれかを他の方法よりも推奨することは困難です。

これらのレコードの多数を効率的にアップサンプリングしたい場合は、SQL ServerのMERGEステートメントに目を向けるでしょう。

https://msdn.microsoft.com/en-us/library/bb510625.aspx

+1

'merge'を使用する際に注意すべきもの:[SQL Serverの' MERGE'文と注意を使用してください - アーロン・ベルトラン] http://www.mssqltips.com/sqlservertip/3074/use-(注意 - SQLサーバー - 併合ステートメント/)と[UPSERT競合条件(Merge-sqlteam)](http://weblogs.sqlteam.com/dang/archive/2009/01/31/UPSERT-Race-Condition- – SqlZim

+1

これは実際には本当に良い点です。通常、MERGEは分析/報告システムに最適です。 –

関連する問題