我有一个非常大的表,有很多行,每一行都有特定日期的每个用户的统计数据。很明显,我没有任何未来的统计数据。所以要更新我使用的统计数据
UPDATE Stats SET Visits=@val WHERE ... a lot of conditions ... AND Date=@Today
但如果该行不存在怎么办?我必须使用
INSERT INTO Stats (...) VALUES (Visits=@val, ..., Date=@Today)
如何检查行是否存在?有没有办法做COUNT(*)?
如果我用空单元格填充表格,则需要数十万行占用兆字节并且不存储任何数据。
答案 0 :(得分:2)
如果您正在使用SQL Server 2008及更高版本,则还应调查2008版本中引入的MERGE
语句。
答案 1 :(得分:1)
我会尝试UPDATE,如果@@ ROWCOUNT = 0,请尝试INSERT
UPDATE Stats SET Visits=@val WHERE ... a lot of conditions ... AND Date=@Today
IF @@ROWCOUNT = 0
INSERT INTO Stats (...) VALUES (Visits=@val, ..., Date=@Today)
或者在TRY / CATCH中尝试INSERT,如果失败则尝试UPDATE。
我不会先测试
答案 2 :(得分:0)
在这些情况下,我倾向于执行以下操作(伪代码,因为我自己就是DB2人员):
try:
INSERT
catch already-exists:
try:
UPDATE
catch anything:
generate error
如果您更有可能拥有行,则可以按相反的顺序执行此操作:
try:
UPDATE
catch not-there:
try:
INSERT
catch anything:
generate error
你从不首先在DBMS中进行测试,因为数据库可以在测试和执行之间进行更改(“更好地请求宽恕而非寻求许可”原则)。
答案 3 :(得分:0)
不幸的是,SQL Server没有任何类型的“INSERT OR UPDATE”命令(我知道),就像一些数据库引擎一样。这意味着您必须首先检查行或捕获其他答案建议的错误。希望你的行有一个人工主键,所以你可以首先使用所有WHERE条件查询该键,然后,如果返回一行,则执行UPDATE ... WHERE key = ...
,否则执行INSERT。这样你就不会两次运行整个查询了。