【问题标题】:MySQL - insert if doesn't exist yetMySQL - 如果还不存在则插入
【发布时间】:2013-01-10 04:39:25
【问题描述】:

我想执行这个 MySQL 查询:

INSERT INTO `cron-stats` (`user`) VALUES (".(int)$d['by-user'].")

只要这样的用户还不存在,例如:

SELECT 1
FROM `cron-stats`
WHERE `user` = ".(int)$d['by-user']."

如何在一个查询中执行此操作?

【问题讨论】:

标签: php mysql sql sql-insert


【解决方案1】:

你可以使用ON DUPLICATE KEY UPDATE

INSERT INTO `cron-stats` (`user`) VALUES ('yourValue')
ON DUPLICATE KEY UPDATE user = user;

但为了很好地执行INSERT 语句,您需要在user 列上设置UNIQUE 索引。

如果该列还没有index,则执行下面的语句,

 ALTER TABLE `cron-stats` ADD CONSTRAINT tb_un UNIQUE (`user`)

【讨论】:

  • 不确定这是否有帮助。我在 CRON 中使用它,我正在为现有条目运行 UPDATE。在UPDATE 运行之前,我想通过插入空值来准备不存在的条目。这是正确的解决方案吗?
  • 为什么需要先插入空值?
  • 哦,好吧,它不起作用。这是带有错误的完整查询:pastebin.com/PyHMY9RG
  • 您在查询中有关键字SET,它不应该存在。删除它并再次执行。
  • 不一样。哦,我在查询末尾看到了 WHERE 子句。也删除它。
【解决方案2】:

有点老套,但如果你使用SELECT 派生表而不是VALUES,你可以这样做:

INSERT INTO `cron-stats`(`user`)
SELECT u
FROM (SELECT @dByUser AS u) x
WHERE NOT EXISTS(SELECT 1 FROM `cron-stats` WHERE `user` = @dByUser)

SQL Fiddle demo

【讨论】:

  • 这保证是原子的吗?也就是说,如果两个insert同时进来,它们是否都可以通过WHERE NOT EXISTS部分并且都insert?
【解决方案3】:

你可以用 if else 条件试试这个

$chk = mysql_query("select 'the username' FROM `cron-stats`");
$rs = mysql_fetch_array($chk);
if($rs == "")
{
    $ins = mysql_query("INSERT INTO `cron-stats` (`user`) VALUES ('.(int)$d['by-user'].')");
} 
else{
    echo "Duplicate entry";
}

【讨论】:

  • 这是一个糟糕的解决方案,因为您在性能优势和 ACID 方面损失惨重。您确实需要将其包装在事务中以使其正常工作,而当有更好的明确命令时,您为什么还要这样做?
猜你喜欢
  • 1970-01-01
  • 2014-04-14
  • 1970-01-01
  • 2013-12-22
  • 2011-11-03
  • 1970-01-01
  • 1970-01-01
  • 2018-09-17
  • 1970-01-01
相关资源
最近更新 更多