MySQL - 如果不存在则插入

9
我希望执行这个MySQL查询: INSERT INTO `cron-stats` (`user`) VALUES (".(int)$d['by-user'].") 如果这样的用户不存在,就会执行上述操作。
SELECT 1
FROM `cron-stats`
WHERE `user` = ".(int)$d['by-user']."

我该如何在一条查询中执行此操作?

在INSERT之后添加IGNORE。 - Strawberry
你已经学习了INSERT语法参考页面吗? - Gumbo
3个回答

22

你可以使用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”运行之前,我想通过插入空值来准备不存在的条目。这是正确的解决方案吗? - Frantisek
为什么需要先插入空值? - John Woo
哦,好吧,它不起作用。这是带有错误的完整查询:http://pastebin.com/PyHMY9RG - Frantisek
你的查询中有一个关键字“SET”,这个关键字不应该出现在那里。请将其删除并重新执行查询。 - John Woo
不一样。哦,我看到查询末尾有一个 WHERE 子句。也将其删除。 - John Woo
显示剩余2条评论

6

虽然有些hacky,但如果您使用 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


2
这是否确保是原子性的?也就是说,如果同时出现两个插入操作,它们都能通过WHERE NOT EXISTS部分并且都执行插入吗? - Cruncher

-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";
}

2
这是一个可怕的解决方案,因为你会失去很多性能优势和ACID。你真的需要将其包装在事务中才能使其正常工作,但为什么要这样做呢?毕竟有明确的命令可以更好地完成任务。 - Brett

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接