SQL - IF EXISTS UPDATE ELSE INSERT INTO

Lau*_*per 73 mysql sql insert exists

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

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'];
Run Code Online (Sandbox Code Playgroud)

这可行,但只是添加新行;

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

mysqli_close($con);
Run Code Online (Sandbox Code Playgroud)

这是我尝试过的;

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);
Run Code Online (Sandbox Code Playgroud)

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);
Run Code Online (Sandbox Code Playgroud)

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);
Run Code Online (Sandbox Code Playgroud)

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

任何帮助是极大的赞赏!

egg*_*yal 186

  1. 如果列尚不存在,请在列上创建UNIQUE约束subs_email:

    ALTER TABLE subs ADD UNIQUE (subs_email)
    
    Run Code Online (Sandbox Code Playgroud)
  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)
    
    Run Code Online (Sandbox Code Playgroud)

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

  1. 请注意,我在字符串文字的位置使用了参数占位符,因为实际应该使用参数化语句来防止SQL注入攻击.

  • @joseph:"*使用`ON DUPLICATE KEY UPDATE`,如果将行作为新行插入,则每行的受影响行值为1;如果更新现有行,则每行受影响的行值为2;如果将现有行设置为其行,则每行受影响的行值为0当前值.*" (2认同)