2014-04-06 46 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

相關問題