【问题标题】:Insert Into on Duplicate Update creates me an unwanted rowInsert Into on Duplicate Update 给我创建了一个不需要的行
【发布时间】:2015-10-26 17:02:45
【问题描述】:

我有一个 SQL 查询如下 -

"INSERT INTO users(id, rank) SELECT v.user, v.vote FROM votes v WHERE
 v.assertion = '$ID' ON DUPLICATE KEY UPDATE 
rank = ( CASE WHEN v.vote = '1' THEN rank+50 WHEN v.vote = '-1' 
THEN rank-200 WHEN v.vote = '3' THEN rank+100 ELSE rank END)"

应用于具有表users 和id 和rank 字段的数据库,以及具有用户和投票字段的votes 表。我必须根据他们的投票更新用户表中用户的排名。

我真的很喜欢这种查询,但我注意到了一个问题:每次我从我的 PHP 脚本执行这个查询时,查询都会在完全空的用户表中添加一行(只有一个 ID,即 A_I,并且排名为 1,通常还会有其他字段)。我实在想不通为什么会发生这种情况。

有什么帮助/想法吗?

【问题讨论】:

  • 我没想到会这样。您能否展示一些示例表/数据来证明这一点(可能在 sqlfiddle 中)。
  • 显示表的完整架构
  • 用户表的 id 字段是否有唯一键?并且您正在尝试第二次插入基于相同 ID(用户)的重复行?
  • 您确定 v.user 和 v.vote 已经存在吗?
  • 尝试让sql fiddle工作,同时我会发布pastebin,希望对您有所帮助。 pastebin.com/heiXJZsi 谢谢!

标签: php mysql duplicates sql-insert


【解决方案1】:

你的表没有主键先给id提供主键

运行这个 sql 查询 更改表用户添加主键 (id) 然后尝试它会起作用

【讨论】:

  • 已经尝试过,甚至放弃并再次创建它。同样的问题。
  • 你能显示完整的数据库模式吗?这样我就可以解决错误。
【解决方案2】:

有两个可能的原因:

  1. id 列不是主键,可能您的表根本没有主键。

像这样创建一个主键:

alter table user add primary key (id) 
  1. 如果您在自动增量列中插入值0,则会生成一个新ID。自动递增的列不得包含值 0

您的方法还有一个更普遍的问题:实际上您只插入了用户 ID 和排名,表中的其他必填字段(用户名)丢失了。由于这个原因,insert 部分似乎无效。如果您使用insert on duplicate key update,则必须确保执行插入和更新的结果是正确的。

【讨论】:

  • id是用户的primary,id,assertion是投票的primary。这不正确吗?
  • A_I ID字段确实是0值。非常感谢。
猜你喜欢
  • 2015-11-17
  • 2011-01-29
  • 2016-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多