2010-11-12 197 views
0

我有一个复杂的问题,创建一个单一的SQL语句工作。 我有三个表,活动,无效和历史。它们是相同的,除了只有活动中的字段点标记为主键。MySQL插入重复更新

Struct: 
-pointid int 
-income_time timestamp 
-outcome_time timestamp 
-receipted_time timestamp 
-type int 
-isack int 

林插入查询转换成活性使用“INSERT INTO活性(点名,income_time,outcome_time,receipted_time,类型,isack)VALUES(100,CURRENT_TIMESTAMP,NULL,NULL,15,0)ON DUPLICATE密钥更新.. ...

和需要帮助构造查询的结束,它将作为如下功能:

- 如果一行点名不存在,做简单的插入
- 如果它确实存在,检查是否类型是一样的,如果是,什么都不做
-if类型是不同的,和ack = 0,将行复制到非活动状态(并将outcome_time设置为CURRENT_TIMESTAMP),然后更新当前行(类型,收入时间,isack)中的当前行。
-if类型如果不同且ack = 1,则将行复制到历史记录(并将outcome_time设置为CURRENT_TIMESTAMP),然后更新当前行(类型,收入时间,isack)。

从逻辑上讲,我认为这可能使用IF语句,但尚未找到一个工作解决方案。有任何想法吗?

+0

为什么只限于单个查询?一个简单的select然后是适当的INSERT,UPDATE或noaction将是明确的可读和主调。 – 2010-11-12 08:40:31

回答

0

我认为这超出了单个查询的能力。它不能有条件地更新不同的表格。你可以使用触发器,编写一个存储过程,或者只需要一个不需要这个的健全的模式。

+0

如果使用触发器,这将如何完成? – Alexander 2010-11-12 08:06:39

+0

您编写了一个程序,执行所有您想要的检查并完成所有这些条件查询。在SQL中。 http://dev.mysql.com/doc/refman/5.0/en/trigger-syntax.html – 2010-11-12 10:19:02