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

use*_*661 6 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
Run Code Online (Sandbox Code Playgroud)

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

bes*_*rld 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}')
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 当存在重复时会抛出警告,但除此之外,只需忽略将副本插入数据库.


Chr*_*nce 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;
Run Code Online (Sandbox Code Playgroud)

你也可以使用它INSERT IGNORE INTO...作为替代,但声明仍然会发出警告(虽然,而不是错误).