2014-04-06 5 views
0

Хорошо, у меня есть несколько операторов MySQL, которые приводят к проблеме, связанной с обновлением определенной таблицы. Прежде всего позвольте мне показать вам мой код, то я объясню, что я пытаюсь сделать:таблица обновления mysql, если запись не находится в таблице temp

/*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..... 

Ok, сначала создать временную таблицу, так что у нас есть таблица для хранения импортированного .csv данных. Затем импортируйте данные .csv во временную таблицу (все это прекрасно работает до сих пор).

Здесь я столкнулся с проблемой. Я хочу обновить столбец каждой записи таблицы first60dayactivity до 0, если запись НЕ найдена в temptable1 (после моего импорта). В конечном счете, я собираю CSV, CSV имеет новые данные в реальном времени, которые следует считать «активными», и мне нужно установить старые данные в inactive. Таким образом, обновление делает INNER JOIN для сопоставления по нескольким столбцам, чтобы узнать, найдена ли запись в temptable1, если она не задана для активности 0, если она находится в temptable1, тогда убедитесь, что статус активности 1.

Проблема заключается в том, что все записи в first60dayactivity сохраняют свойство 1, чтобы указать, что он активен. Ничто не обновляется до 0, хотя у меня есть доказательство наличия новых записей в пределах temptable1 ... Может ли кто-нибудь сказать мне, что я делаю неправильно в моем запросе?

Заранее благодарен!

ответ

1

temp. mid никогда не может быть NULL, потому что вы используете этот столбец в своем состоянии соединения, и используете INNER JOIN.

Ваше соединение (без вставки) должно возвращать соответствующие строки. Использование LEFT JOIN для обновления должно делать то, что, я полагаю, вы хотите сделать.

+0

Был ли двойной отрицательный («никогда не может быть NULL») специально? Я думаю, не :) – sehe

+0

Спасибо, ты прав, конечно. Это была ошибка. Я отредактировал свой ответ. – VMai

+0

похоже, что вы решили мою проблему, я знал, что другой взгляд на это поможет! Большое спасибо. – sadmicrowave

Смежные вопросы