sql - 如果记录不存在,则 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 语句,因为现在我被卡住了。
解决方案
试试这个版本:
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);
推荐阅读
- python - 并行使用子进程 check_all 提交大文件
- python - 如何通过服务器收听新的 POST 方法?
- php - 解析错误:语法错误,第 17 行 C:\xampp\htdocs\policycode\sample_code\policy1.php 中的意外 '->' (T_OBJECT_OPERATOR)
- javascript - 从 fetchapi 输出结果到 html
- swift - SwiftSoup 将数据分配给自定义类
- javascript - 查找构成特定数字的所有可能组合 JavaScript
- angular - Angular 6 mat-sidenav 切换菜单不起作用
- ios - 当 AVSpeechUtterance 使用 Alex 和属性字符串时,AVSpeechSynthesizer.speak 崩溃
- eclipse - 在 Eclipse 上设置 WxWidgets 项目
- angular - 元素定位 - 参考更高的组件