怎样使得 MySQL 当记录不存在时插入,当记录存在时更新?

2015-12-16 11:30:44 +08:00
 billgreen1


ID,date,code,prediction, fact
ID 自动增长, primary key
当 date 和 code 确定,能确定这一条记录。

目的:
每天更新昨日预测结果和发布次日预测。
假设今天是 2015-12-15 ,记录应该如下:
ID date code prediction fact
1 2015-12-15 000001 1 1
2 2015-12-15 000002 1 -1
3 2015-12-16 000001 1 NULL
4 2015-12-16 000002 1 NULL

2015-12-16 这天的工作就是:
1. 根据今天的 fact 结果,更新本日的记录。
2. 发布 2015-12-17 这天的记录。

目前的做法: 删除日期大于等于 2015-12-16 的所有记录,然后插入新的记录。

遇到的问题:
1. 2015-12-16 的 prediction 是 2015-12-15 这日做出的,如果 12-16 这一日的预测模型变了, prediction 也会跟着变。会让人觉得我是在修改昨日预测,这样不好。
2. 有时候我要多次运行程序,先删除再添加会让 ID 显得很奇怪。

希望的做法(这两条 SQL 我都不是太会写,我用的 sqlalchemy):
1. 直接插入,如果表里有当前(date,code),则更新这条记录。 OR
2. 直接更新,如果表里没有当前( date,code)则进行插入。

或者有更好的方法?

谢谢

5922 次点击
所在节点    MySQL
24 条回复
TaMud
2015-12-16 16:02:37 +08:00
insert into select where not exists()
TaMud
2015-12-16 16:03:29 +08:00
不要忘了 limit 1
lixiaoxie
2015-12-16 16:06:30 +08:00
REPLACE INTO t_xxx (date,code,prediction,fact) VALUES (xx,xx,xx,xx);
Chrics
2015-12-16 16:33:07 +08:00
ORM 框架大部分都内置这个功能的吧?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/243890

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX