2010-06-07 74 views
0

我想解決一個問題,我繼承了對不同數據源的不良處理。我有一個包含善惡用戶的用戶表。INSERT..ON DUPLICATE KEY UPDATE - 但不使用重複密鑰來比較

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與第一個表中的user_id不一致。

我想讓我的所有用戶都在一張桌子上,並簡單地標記哪些是好的,哪些是壞的。

我想要做的是改變用戶表並添加一個默認爲0的列('evil')然後我想從我的'users_evil'表中轉儲數據,然後運行INSERT..ON將這些數據複製密鑰更新放入第一個表(設置'evil'= 1,其中電子郵件匹配)

問題在於'PK'設置爲user_id而不是'email'。 任何建議,或甚至成功實現這一目標的另一種策略。

我可以運行這個語句,但是在語句持續時間內將另一列作爲PK來處理。

回答

2
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;  

你只需要在用戶表

+0

我不知道你可以在更新期間加入 - 這正是我發佈到SO的原因。感謝這個答案。 – calumbrodie 2010-06-07 16:10:37

+0

當你只運行一次這樣簡單的查詢時,我沒有看到有臨時索引的一點。 – 2010-06-07 16:13:06

+0

確實。你的方法更有意義。標記爲正確,感謝您的幫助 – calumbrodie 2010-06-07 16:16:16

2

你看這個:

update users set evil=1 where email in (select email from users_evil); 
+0

這應該工作,但它似乎導致我的服務器崩潰並燃燒。我注意到你不能在mysql中進行EXPLAIN更新?我的數據集不是很大(大約20k行)。謝謝 – calumbrodie 2010-06-07 16:15:02

0

你可以執行外連接表的更新不良用戶,然後檢測其中一個用戶是邪惡通過尋找非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; 
+1

其實,現在我想到了,外連接甚至不需要。查看Imre L對沒有外連接的版本的回答。 – VeeArr 2010-06-07 16:09:38

+0

感謝您的回答 – calumbrodie 2010-06-07 16:16:41

相關問題