我有一个如下所示的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查询?

最佳答案

您当然可以像这样使用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 -clause可能会产生意外的结果(您实际上没有100%的控制权会发生什么情况)

示例:-下面的这一行仅更新ONE行(如果类型为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会发出警告,但除此之外,请忽略以将重复项插入数据库。

关于php - 避免在INSERT查询中重复唯一键,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16338578/

10-16 14:45