我有一个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
Run Code Online (Sandbox Code Playgroud)
有没有办法确保SQL查询不会尝试添加已存在的唯一值而不运行SELECT整个数据库的查询?
您当然可以使用INSERT IGNORE INTO,如下所示:
INSERT IGNORE INTO beer(name, type, alcohol_by_volume, description, image_url) VALUES('{$name}', {$type}, '{$alcohol_by_volume}', '{$description}', '{$image_url}')
Run Code Online (Sandbox Code Playgroud)
你可以使用ON DUPLICATE KEY,但如果你只是不想添加一行INSERT IGNORE INTO是一个更好的选择.ON DUPLICATE KEY如果你想在有重复的时候做更具体的事情,那就更适合了.
如果您决定使用ON DUPLICATE KEY- 请避免在具有多个唯一索引的表上使用此子句.如果你有一个包含多个唯一索引的表ON DUPLICATE KEY--clause可能会给出意想不到的结果(你真的没有100%控制会发生什么)
示例: - 下面的这一行只更新一行(如果type为1而alcohol_by_volume为1(两列都是唯一索引))
ON DUPLICATE KEY UPDATE beer SET type=3 WHERE type=1 or alcohol_by_volume=1
Run Code Online (Sandbox Code Playgroud)
把它们加起来:
ON DUPLICATE KEY 当有重复时,只做没有警告或错误的工作.
INSERT IGNORE INTO 当存在重复时会抛出警告,但除此之外,只需忽略将副本插入数据库.
正如它所发生的那样,在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;
Run Code Online (Sandbox Code Playgroud)
你也可以使用它INSERT IGNORE INTO...作为替代,但声明仍然会发出警告(虽然,而不是错误).
| 归档时间: |
|
| 查看次数: |
3393 次 |
| 最近记录: |