我有一个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
查询的情况下不会尝试添加已存在的唯一值?
答案 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语句一起处于事务中,以便其他人来做同样的事情不是问题。