2012-03-07 62 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 ... 
相关问题