首页 > 解决方案 > 如果记录不存在,则 SQL 插入无论如何都会插入

问题描述

我正在尝试做一个和 INSERT 类似的声明:docs.microsoft

我的 sql 语句如下所示:

INSERT INTO dbo.Table1([Name], [Value], [Period], [As of Date])
    VALUES ('Cust Index', -10.75468724987, '1M', '2018-10-31')
    SELECT 'Cust Index', -10.75468724987, '1M', '2018-10-31' 
        WHERE NOT EXISTS (SELECT [Name], [Period], [As of Date] FROM Table1
                            WHERE [Name] = 'Cust Index' AND [Period] = '1M' )

我无法弄清楚我做错了什么,因为即使值存在,它仍然会更新 table1。我从比较中排除了 [Value] 字段,因为每次运行我的函数时都会重新计算它,并且我想确保它不会仅仅因为它少了几个小数位而插入到我的表中。

也许答案很简单,我只需要第二双眼睛就能看到我的 sql 语句,因为现在我被卡住了。

标签: sqlsql-serverinsert

解决方案


试试这个版本:

INSERT INTO dbo.Table1([Name], [Value], [Period], [As of Date])
    SELECT v.*
    FROM (VALUES ('Cust Index', -10.75468724987, '1M', '2018-10-31')
         ) v(Name, Value, Period, AsOfDate)
    WHERE NOT EXISTS (SELECT 1
                      FROM Table1 t1
                      WHERE t1.Name = v.name AND t1.Period = v.Period
                     );

这避免了所有列值的重复。

请注意,确保数据不重复的最佳方法是使用唯一约束或索引:

create unique index unq_table1_name_period on table1(name, period);

推荐阅读