2013-03-13 53 views
65

我想要做的是INSERT我的數據庫中的用戶,但IF EXISTS它應該UPDATE行,ELSE INSERT INTO一個新的行。SQL - 如果存在更新ELSE INSERT INTO

當然我首先連接到數據庫,GET$name,$email$birthday從url字符串。

$con=mysqli_connect("localhost","---","---","---"); 
// Check connection 
if (mysqli_connect_errno()) 
    { 
    echo "Failed to connect to MySQL: " . mysqli_connect_error(); 
    } 

$name=$_GET['name']; 
$email=$_GET['email']; 
$birthday=$_GET['birthday']; 

這個工作,但只是增加了新的行;

mysqli_query($con,"INSERT INTO subs (subs_name, subs_email, subs_birthday) 
VALUES ('$name', '$email', '$birthday')"); 

mysqli_close($con); 

這是我試過的;

mysqli_query($con,"INSERT INTO subs (subs_name, subs_email, subs_birthday) 
VALUES '$name', '$email', '$birthday' 
ON DUPLICATE KEY UPDATE subs_name = VALUES($name), subs_birthday = VALUES($birthday)"); 
mysqli_close($con); 

mysqli_query($con,"IF EXISTS (SELECT * FROM subs WHERE subs_email='$email') 
    UPDATE subs SET subs_name='$name', subs_birthday='$birthday' WHERE subs_email='$email' 
ELSE 
    INSERT INTO subs (subs_name, subs_email, subs_birthday) VALUES ('$name', '$email', '$birthday')"); 
mysqli_close($con); 

mysqli_query($con,"IF NOT EXISTS(SELECT * FROM subs WHERE subs_email='$email') 
Begin 
INSERT INTO subs (subs_name, subs_email, subs_birthday) 
VALUES ('$name', '$email', '$birthday') 
End"); 
mysqli_close($con); 

但他們沒有工作,我究竟做錯了什麼?

任何幫助,非常感謝!

+2

你對桌子有獨特的限制嗎? – 2013-03-13 11:22:44

+1

[Insert into MySQL table or update if exists](http://stackoverflow.com/questions/4205181/insert-into-a-mysql-table-or-update-if-exists) – 2016-06-07 14:41:01

回答

167
  1. subs_email列創建UNIQUE constraint,如果一個尚不存在:

    ALTER TABLE subs ADD UNIQUE (subs_email) 
    
  2. 使用INSERT ... ON DUPLICATE KEY UPDATE

    INSERT INTO subs 
        (subs_name, subs_email, subs_birthday) 
    VALUES 
        (?, ?, ?) 
    ON DUPLICATE KEY UPDATE 
        subs_name  = VALUES(subs_name), 
        subs_birthday = VALUES(subs_birthday) 
    

您可以使用VALUES (col_name)函數中UPDATE子句 指列值從插入的插入部... ON DUPLICATE密鑰更新 - dev.mysql.com

  • 注意,我在地方使用參數佔位符字符串文字,作爲一個真的應該使用參數化語句defend against SQL injection attacks
  • +0

    You da man !像魅力一樣工作,現在可以找到防止注射的方法。在人們確認訂閱新聞簡報後,我將數據發送到數據庫,並在參數中顯示參數。任何想法如何確保這一點? Thnx – 2013-03-13 13:06:51

    +0

    @freakstyler:看到我的第三點,特別是它所鏈接的答案。 – eggyal 2013-03-13 13:10:07

    +0

    這是這個cewl!我現在一直在使用MySQL,並且從未使用過它! – 2014-12-20 15:55:47