MySQL SQL - IF EXISTS UPDATE ELSE INSERT INTO

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/15383852/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-31 16:53:29  来源:igfitidea点击:

SQL - IF EXISTS UPDATE ELSE INSERT INTO

mysqlsqlinsertexists

提问by Laurence Cooper

What I'm trying to do is INSERTsubscribers in my database, but IF EXISTSit should UPDATEthe row, ELSE INSERT INTOa new row.

我想要做的是INSERT我的数据库中的订阅者,但IF EXISTS它应该UPDATE是一行,ELSE INSERT INTO一个新行。

Ofcourse I connect to the database first and GETthe $name, $emailand $birthdayfrom the url string.

Ofcourse我连接到数据库第一和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'];

This works, but just adds the new row;

这有效,但只是添加了新行;

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

mysqli_close($con);

Here's what I tried;

这是我尝试过的;

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

and

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

and

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

But none of them work, what am I doing wrong?

但它们都不起作用,我做错了什么?

Any help is greatly appreciated!

任何帮助是极大的赞赏!

回答by eggyal

  1. Create a UNIQUEconstrainton your subs_emailcolumn, if one does not already exist:

    ALTER TABLE subs ADD UNIQUE (subs_email)
    
  2. Use 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)
    
  1. 在您的列上创建一个UNIQUE约束subs_email(如果尚不存在):

    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)
    

You can use the VALUES(col_name) function in the UPDATE clause to refer to column values from the INSERT portion of the INSERT ... ON DUPLICATE KEY UPDATE - dev.mysql.com

您可以在 UPDATE 子句中使用 VALUES(col_name) 函数来引用来自 INSERT ... ON DUPLICATE KEY UPDATE 的 INSERT 部分的列值 - dev.mysql.com

  1. Note that I have used parameter placeholders in the place of string literals, as one reallyshould be using parameterised statements to defend against SQL injection attacks.
  1. 请注意,我使用参数占位符代替字符串文字,因为确实应该使用参数化语句来防御 SQL 注入攻击