Sql server 如何设置/配置表以确保我不';不要输入重复的记录。

Sql server 如何设置/配置表以确保我不';不要输入重复的记录。,sql-server,azure,Sql Server,Azure,我正在使用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 我正在使用更新或插入(如果是

我正在使用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)
如果我插入以下记录:

 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)
数据库将插入一个图表Id为2的新记录,但我不希望这样做。对我来说,这是一个重复的记录

我还做了一些研究,发现了一些关于独特约束的信息

从我的发现来看,我相信我能做到

Use TestDB;
Go
Alter Table CHART
ADD CONSTRAINT AK_UNIQUECHART_CODE UNIQUE (CHART_CODE);
实现无重复记录目标的最佳实践是什么


谢谢你的意见

您可以使用某个版本的

粗略的草稿如下所示:

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;

嗯,这里缺少一点信息,但听起来你的图表代码真的是你的主键,除非你在使用代理。如果是,并且图表代码是查找列,则也可以在其中添加非聚集唯一索引

使用唯一约束或非聚集唯一索引将主键更改为图表代码将对插入产生与创建唯一约束类似的影响,但请注意,在这种情况下,所有非唯一的插入都会失败,但索引可能会对查询计划产生影响,因此,在不知道检索模式的情况下,很难推荐其中一种方法

如果您希望高效地对大量这些记录执行upsert,我将把您的目光转向SQL Server的MERGE语句


使用
merge
时需要注意的事项:这实际上是一个很好的观点,通常merge最适合于分析/报告系统。