INSERT..ON DUPLICATE KEY UPDATE - но НЕ использовать дубликат ключа для сравнения - PullRequest
0 голосов
/ 07 июня 2010

Я пытаюсь решить проблему, унаследованную мной, из-за плохого обращения с различными источниками данных. У меня есть таблица пользователей, которая содержит ОБА хороших и злых пользователей.

create table `users`( 
  `user_id` int(13) NOT NULL AUTO_INCREMENT , 
  `email` varchar(255) , 
  `name` varchar(255) ,  
  PRIMARY KEY (`user_id`)
);

В этой таблице первичный ключ в настоящее время установлен как user_id.

У меня есть другая таблица ('users_evil'), которая содержит ТОЛЬКО злых пользователей (все пользователи из этой таблицы включены в первую таблицу) - идентификаторы user_id в этой таблице НЕ соответствуют тем, которые указаны в первой таблице. *

Я хочу, чтобы все мои пользователи были в одной таблице, и просто отмечали, какие добрые, а какие злые.

Что я хочу сделать, так это изменить таблицу пользователей и добавить столбец («зло») со значением по умолчанию 0. Затем я хочу сбросить данные из моей таблицы «users_evil») и затем выполнить команду INSERT..ON DUPLICATE. КЛЮЧЕВОЕ ОБНОВЛЕНИЕ с этими данными в первой таблице (установка 'evil' = 1, где электронные письма совпадают)

Проблема в том, что для PK задано значение user_id, а не «email». Любые предложения или даже другая стратегия для успешного достижения этой цели.

Могу ли я запустить этот оператор, но обработать другой столбец как PK только на время действия оператора.

Ответы [ 3 ]

2 голосов
/ 07 июня 2010
ALTER table add column...

UPDATE users set evil = 0;

UPDATE users u join users_evil ue ON ue.email = u.email and u.name = ue.name set evil = 1;    

вам нужно только обновить плохих пользователей в таблице пользователей

2 голосов
/ 07 июня 2010

что по этому поводу:

update users set evil=1 where email in (select email from users_evil);
0 голосов
/ 07 июня 2010

Вы можете выполнить внешнее объединение таблиц, а затем определить, где пользователь злой, ища не- NULL значения:

UPDATE (users LEFT OUTER JOIN evil_users ON users.email = evil_users.email)
  SET users.evil=1
  WHERE evil_users.some_field IS NOT NULL;
...