关于使用 SQL Server (ASP.NET MVC) 插入/更新行的问题
我有一个非常大的表,有很多行,每一行都有每个用户在特定日期的统计信息。显然我没有任何未来的统计数据。因此,要更新我使用的统计信息
UPDATE Stats SET Visits=@val WHERE ... a lot of conditions ... AND Date=@Today
,但是如果该行不存在怎么办?我必须使用
INSERT INTO Stats (...) VALUES (Visits=@val, ..., Date=@Today)
如何检查该行是否存在?与执行 COUNT(*) 有什么不同吗?
如果我用空单元格填充表格,则需要数十万行,占用兆字节并且不存储任何数据。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
如果您使用的是 SQL Server 2008 及更高版本,您还应该研究 2008 版本中引入的
MERGE
语句。If you're using SQL Server 2008 and up, you should also investigate the
MERGE
statement introduced in the 2008 version.我会尝试更新,然后如果 @@ROWCOUNT = 0 尝试插入
或尝试在 TRY/CATCH 中插入,然后如果失败则更新。
我不会先测试
I would try an UPDATE, then if @@ROWCOUNT = 0 try an INSERT
Or try an INSERT inside a TRY/CATCH and then UPDATE if it fails.
I wouldn't test first
在这些情况下,我倾向于执行以下操作(伪代码,因为我自己就是 DB2 人员):
如果您更有可能拥有行,则可以按相反的顺序执行此操作
: >永远不要首先在 DBMS 中进行测试,因为数据库可能会在测试和执行之间发生变化(“请求宽恕比寻求许可更好”原则)。
What I tend to do in those cases is just perform the following (pseudo-code since I'm a DB2 man myself):
You can do it in the opposite order if you're more likely to have rows than not:
You never test first in a DBMS since the database can change underneath you between the test and the execution (the "better to ask forgiveness than seek permission" principle).
不幸的是,SQL Server 没有任何类型的“INSERT OR UPDATE”命令(据我所知),就像某些数据库引擎一样。这意味着您必须首先检查该行或按照其他答案的建议捕获错误。希望您的行有一个人工主键,因此您可以首先使用所有 WHERE 条件查询该键,然后,如果返回一行,则执行
UPDATE ... WHERE key = ...
,否则执行 INSERT。这样您就不会运行整个查询两次。Unfortunately SQL Server doesn't have any kind of "INSERT OR UPDATE" command (that I know of), like some DB engines. That means that you do have to check for the row first or catch the error as other answers recommend. Hopefully your row has an artificial primary key, so what you could is first query for that key using all your WHERE conditions and then, if a row is returned do an
UPDATE ... WHERE key = ...
, otherwise do an INSERT. That way you're not running the entire query twice.