【问题标题】:simple insert procedure, check for duplicate简单的插入过程,检查重复
【发布时间】:2011-10-23 17:09:25
【问题描述】:

我正在创建一个程序,它将数据插入一个非常简单的表中

但我的问题是我希望我的插入语句确保它没有插入重复数据

我想以某种方式检查数据要进入的表,以确保没有一行具有相同的 indivualid 和 categoryid 和 value

所以如果我要插入

indivualid = 1
categorid = 1
value = 1

在我的桌子上有一行

indivualid = 1
categorid = 1
value = 2 

我的数据仍然会被插入

但是如果有一行

indivualid = 1
categorid = 1
value = 1

那就不会了

我试过了

IF @value = 'Y'
OR @value = 'A'
OR @value = 'P'
AND NOT EXISTS
  (SELECT categoryid,
          individualid
   FROM ualhistory
   WHERE categoryid = @cat
     AND individualid = @id)
INSERT INTO individuory(categoryid, individualid, value, ts)
VALUES (@cat,
        @id,
        @yesorno,
        getdate())

但它仍然会插入重复项。

【问题讨论】:

    标签: sql stored-procedures sql-server-2000


    【解决方案1】:

    您可以通过以下方式做到这一点:

    insert into 
    individuory(categoryid, individualid, value, ts) 
    VALUES (@cat, @id, @yesorno, getdate()) 
    where not exists 
    (select 1 from individuory where categoryid=@cat and individualid=@id)
    

    现在,您的方法的确切问题是您没有关联 OR,因此条件变为真并始终插入数据。您可以将您的声明更改为:

    if ((@value = 'Y' or @value = 'A' or @value = 'P') 
    and not EXISTS 
    (SELECT categoryid, individualid FROM ualhistory WHERE categoryid = @cat 
     and individualid = @id) )
     INSERT INTO individuory(categoryid, individualid, value, ts) 
     VALUES (@cat, @id, @yesorno, getdate()) 
    

    而且我认为它也会起作用。

    【讨论】:

    • 我尝试了第二种方法,因为这是我尝试的方法,但它仍然插入重复记录
    • 啊我明白了我没有 if in ()
    • @bugz 不,那是不可能的。你这样做的方式几乎是正确的,除了你错过了几个 ( 和 )。试试我的最后一句话。
    • @bugz 很高兴它成功了。是的,我注意到您缺少 ()。
    【解决方案2】:
    ALTER TABLE individuory
    ADD CONSTRAINT myConstarint
    UNIQUE (categoryid, individualid, value)
    

    【讨论】:

    • 如果我添加此约束是否意味着只有所有 3 的值必须连续相等,或者它是否拒绝所有具有相同类别 ID 但 indidualid 和值不同的行
    • @bugz,为什么不试试看呢?但答案是它是对所有三列组合的唯一约束。
    • 例如,如果已经有记录indivualid = 1, categorid = 2, value = 3,则不会插入另一条indivualid = 1, categorid = 2, value = 3的记录
    • 警告!最大密钥长度为 900 字节。索引“myConstraint”的最大长度为 8008 字节。对于较大值的某些组合,插入/更新操作将失败。消息 1505,级别 16,状态 1,第 1 行 CREATE UNIQUE INDEX 终止,因为发现索引 ID 6 的重复键。最重要的主键是“2”。消息 1750,级别 16,状态 0,行 1 无法创建约束。请参阅以前的错误。声明已终止。
    【解决方案3】:

    在 (individualid, categoryid, value) 上添加UNIQUE 约束,服务器不会让您插入重复的行。

    http://msdn.microsoft.com/en-us/library/ms189862.aspx

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-12
      • 2011-12-04
      • 1970-01-01
      • 1970-01-01
      • 2018-08-18
      • 2016-06-27
      • 2023-04-02
      相关资源
      最近更新 更多