2016-12-23 3 views
1

Я работаю с Azure SQL Database (Microsoft SQL Azure (RTM) - 12.0.2000.8 от 5 декабря 2016 21:15:30), и я пытаюсь настроить таблицу (CHART), чтобы я не получил никаких дубликатов записей , Структура таблицы выглядит следующим образом:Как настроить/настроить таблицу, чтобы я не вводил повторяющиеся записи.

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 

Если я Upsert следующую запись:

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) 

База данных будет вставить новую запись с Chart_Id = 2, но я не хочу его к. Для меня это дубликат.

Я также провел небольшое исследование и нашел некоторую информацию об уникальных ограничениях.

Из того, что я нашел, что я считаю, что я мог бы сделать что-то вроде

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

Ну, есть немного информации здесь отсутствует, но это звучит как ваш код диаграммы на самом деле ваш первичный ключ, если вы не используете суррогат для чего-то. Если вы и код диаграммы - столбец поиска, вы можете добавить туда некластеризованный уникальный индекс.

Изменение первичного ключа на графический код с использованием уникального ограничения или некластеризованного уникального индекса окажет аналогичное влияние на вставки как на создание уникального ограничения, но имейте в виду все вставки, которые не являются уникальными. в этой ситуации, но индексы потенциально могут повлиять на ваш план запросов, поэтому, не зная, как выглядит ваш шаблон поиска, трудно рекомендовать один из этих подходов к другому.

Если вы хотите эффективно использовать большое количество этих записей, я обращу внимание на инструкцию MERGE SQL Server.

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

+1

Вещи, чтобы быть в курсе при использовании 'merge': [осмотрительность с' MERGE' Заявление в SQL Server - Aaron Bertrand] (http://www.mssqltips.com/sqlservertip/3074/use- caution-with-sql-servers-merge-statement /) и [Состояние гонки в UPSERT с объединением - sqlteam] (http://weblogs.sqlteam.com/dang/archive/2009/01/31/UPSERT-Race-Condition- With-MERGE.aspx) – SqlZim

+1

Это действительно хороший момент, обычно MERGE лучше всего подходит для аналитических/отчетных систем. –