2014-04-06 47 views
0

好的,我有多个MySQL语句导致我正在更新特定表的问题。首先让我告诉你我的代码,然后我会解释我想要做的事:如果记录不在临时表中,mysql更新表

/*STEP 1 - create a temporary table to temporarily store the loaded csv*/ 
CREATE TEMPORARY TABLE IF NOT EXISTS `temptable1` LIKE `first60dayactivity`; 

/*STEP 2. load the csv into the previously created temporary table*/ 
LOAD DATA LOCAL INFILE '/Users/me/Downloads/some.csv' 
IGNORE INTO TABLE `{temptable}` 
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"' 
LINES TERMINATED BY '\r\n' 
IGNORE 1 LINES 
SET CUSTID = 1030, 
    CREATED = NOW(), 
    isactive = 1; 

/*STEP 3. update first60dayactivity table changing isactive for records that are not in the temptable*/ 
UPDATE `first60dayactivity` fa 
    INNER JOIN `temptable1` temp 
     ON temp.`mid` = fa.`mid` 
     AND temp.`primarypartnername` = fa.`primarypartnername` 
     AND temp.`market` = fa.`market` 
     AND temp.`agedays` = fa.`agedays` 
     AND temp.`opendate` = fa.`opendate` 
     AND temp.`CUSTID` = fa.`CUSTID` 
SET fa.isactive = IF(temp.`mid` IS NULL, 0, 1); 

/*STEP 4. insert the temp table records into the real table*/ 
.....blah blah blah..... 

好吧,首先创建一个临时表,使我们有一个表来存放导入的.csv数据。接下来,将.csv数据导入临时表(到目前为止,所有这些工作都很完美)。

这里是我遇到问题的地方。如果在temptable1(导入后)中找不到记录,我想将first60dayactivity表的每条记录的isactive列更新为0。最终,我正在收集一个.csv文件,该.csv文件中包含应该被视为“活动”的新的实时数据,我需要将旧数据设置为inactive。因此,更新进行INNER JOIN以匹配多个列,以查看在temptable1中是否找到记录,如果未将活动设置为0,如果在temptable1中找到该记录,则确保活动状态为1

这里的问题是,first60dayactivity中的所有记录都保留1属性以指示它处于活动状态。即使我有证据temptable1内存在新的记录,什么都没有更新到0 ...有人能告诉我我在查询中做错了什么吗?

在此先感谢!

回答

1

temp。 mid永远不会是NULL,因为您在连接条件中使用此列,并且您使用INNER JOIN

你的连接(没有插入)应该返回匹配的行。使用LEFT JOIN进行更新应该可以做我想做的事情。

+0

故意双重否定(“永远不可能是NULL”)吗?我认为不是:) – sehe

+0

谢谢,你当然是对的。那是个错误。我编辑了我的答案。 – VMai

+0

看起来像你已经解决了我的问题,我知道另一组眼睛看着这会有所帮助!非常感谢。 – sadmicrowave

相关问题