2012-03-07 82 views
1

我想將值寫入「email_new」列,但前提是該值不存在於名爲「email」的第二列中。這意味着列電子郵件中的任何條目都不應包含新的郵件地址。MySQL:如果在列2中不存在值,如何更新colum1

這是一個程序來更改電子郵件地址,其中的電子郵件地址必須驗證,並且「email」列只允許UNIQUE值。

" 
UPDATE `table` 
SET email_new = '".mysql_real_escape_string($newmail)."' 
WHERE 
    user = '".mysql_real_escape_string($user)."' 
    && email NOT CONTAINS('".mysql_real_escape_string($newmail)."') 
" 

是這樣的可能嗎?

+0

你要做到這一點在存儲過程中? – 2012-03-07 07:51:13

+0

是其可能的,但你可以只使用'電子郵件!=「‘.mysql_real_escape_string($ NEWMAIL)。’」' – DdD 2012-03-07 07:51:17

+0

爲什麼用戶等於以電子郵件嗎? – hoppa 2012-03-07 07:52:28

回答

1

你不檢查wheter的NEWMAIL真的是獨一無二的:

追加到您的查詢另一個AND條件,是這樣的:從表 AND 0 =(SELECT COUNT(*),其中電子郵件= mysql_real_escape_string($ NEWMAIL) )

+0

我剛剛意識到的MySQL 4.0好像不支持子查詢,......如此看來,我要送兩個單獨的查詢,直到該數據庫的更新,... – 2012-03-07 08:17:53

+0

這可能是一個解決辦法:1)啓動一個新的事務2 )檢查NEWMAIL在數據庫表已經存在:如果沒有3)執行TE更新,然後提交事務,如果是4)中止交易。如果你的系統有很多用戶,交易避免了可能導致重複郵件地址的競爭條件 – 2012-03-07 08:29:41

1
$q = " 
    UPDATE 
     `table` 
    SET 
     `email_new` = '" . mysql_real_escape_string($newmail) . "' 
    WHERE 
     `user` = '" . mysql_real_escape_string($newmail) . "' 
    AND NOT EXISTS (
     SELECT 
      `email` 
     FROM 
      `table` 
     WHERE 
      `email` = '" . mysql_real_escape_string($newmail) . "' 
    ) 
"; 
1
UPDATE table 
SET email_new = ? 
WHERE 
    user = ? 
    AND (SELECT COUNT(*) = 0 FROM table WHERE email = ?) 

由實際值進行替代?跡象。

0

或者乾脆

UPDATE `table` 
SET email_new = IF (email IS NULL, ?, ?) 
-- this line is if you want to update email if email is not null 
, email = IF (email IS NOT NULL, ?, ?) 
WHERE ... 
相關問題