避免在INSERT查询中复制唯一键

时间:2013-05-02 12:53:50

标签: php mysql

我有一个MySQL查询,如下所示:

INSERT INTO beer(name, type, alcohol_by_volume, description, image_url) VALUES('{$name}', {$type}, '{$alcohol_by_volume}', '{$description}', '{$image_url}')

唯一的问题是name是一个唯一值,这意味着如果我遇到重复项,我会收到如下错误:

Error storing beer data: Duplicate entry 'Hocus Pocus' for key 2

有没有办法确保SQL查询在没有对整个数据库运行SELECT查询的情况下不会尝试添加已存在的唯一值?

5 个答案:

答案 0 :(得分:8)

你当然可以使用INSERT IGNORE INTO,如下所示:

INSERT IGNORE INTO beer(name, type, alcohol_by_volume, description, image_url) VALUES('{$name}', {$type}, '{$alcohol_by_volume}', '{$description}', '{$image_url}')

您也可以使用ON DUPLICATE KEY,但如果您不想添加行INSERT IGNORE INTO则是更好的选择。 ON DUPLICATE KEY更适合如果你想在有重复时做更具体的事情。

如果您决定使用ON DUPLICATE KEY - 请避免在具有多个唯一索引的表上使用此子句。如果你有一个包含多个唯一索引的表ON DUPLICATE KEY - 条款可能会产生意想不到的结果(你真的没有100%控制将要发生的事情)

示例: - 下面这一行只更新一行(如果type为1且alcohol_by_volume为1(两列都是唯一索引))

ON DUPLICATE KEY UPDATE beer SET type=3 WHERE type=1 or alcohol_by_volume=1

总结一下:

ON DUPLICATE KEY只是在有重复的情况下完成工作而没有警告或错误。

当有重复项时,

INSERT IGNORE INTO会发出警告,但除此之外,只需忽略将副本插入数据库。

答案 1 :(得分:6)

正如它所发生的那样,MySQL中有一种方法可以使用ON DUPLICATE KEY UPDATE。这是从MySQL 4.1

以来可用的
INSERT INTO beer(name, type, alcohol_by_volume, description, image_url)
  VALUES('{$name}', {$type}, '{$alcohol_by_volume}', '{$description}',
  '{$image_url}')
  ON DUPLICATE KEY UPDATE type=type;

您也可以使用INSERT IGNORE INTO...作为替代,但该语句仍然会发出警告(尽管而不是错误)。

答案 2 :(得分:2)

是的,有。您可以使用mysql ON DUPLICATE KEY语句的INSERT子句。语法解释为here

INSERT INTO beer(name, type, alcohol_by_volume, ...) 
  VALUES('{$name}', {$type}, '{$alcohol_by_volume}', ...)
  ON DUPLICATE KEY UPDATE 
     type={$type}, alcohol_by_volume = '{$alcohol_by_volume}', ... ;

答案 3 :(得分:0)

是的,首先从数据库中选择名称,如果查询结果不为空(零记录),则名称已经存在,您必须得到另一个名称。

答案 4 :(得分:0)

很简单 - 如果某些内容试图插入重复的名称,您的代码需要弄清楚它想要做什么。因此,首先需要做的是运行一个select语句:

 SELECT * FROM beer WHERE name='{$name}'

然后运行'if'语句来判断你是否得到了结果。

如果结果= 0,则继续运行插入。 否则......无论你想做什么。向用户抛出错误?以不同的方式修改数据库?完全忽略它?这个插入语句怎么样?从文件批量更新?来自网页的用户输入?

您到达此插入语句的方式以及它应如何影响您的工作流程,应该确切地确定您如何处理“其他”。但你绝对应该处理它。

但是,只需确保select和insert语句一起处于事务中,以便其他人来做同样的事情不是问题。

相关问题