MySQL ON DUPLICATE KEY UPDATE和auto_increment index

时间:2014-08-06 14:37:47

标签: mysql auto-increment insert-update on-duplicate-key

我一直在寻找MySQL文档,但没有找到关于以下问题的明确答案。

假设我有一个表“用户”。使用以下字段:

CREATE TABLE `users` (
  `userId` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(16) NOT NULL,
  `password` varchar(128) NOT NULL,
  `salt` varchar(128) NOT NULL,
  `email` varchar(256) NOT NULL,
  PRIMARY KEY (`userId`),
  UNIQUE KEY `username` (`username`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;

所以我有一个主键“userId”,它是一个auto_increment值。还有一个独特的字段“用户名”。 (因此每个用户名只能出现一次,但用户名应该是可编辑的。)

现在我想知道在这种情况下我应该如何使用ON DUPLICATE KEY UPDATE语句。 (不要介意不安全的方式,但在本例中这更易于阅读。)

INSERT INTO users (`userId`, `username`, `password`, `salt`, `email`)
VALUES('$userId', '$username', '$password', '$salt', '$email')
ON DUPLICATE KEY UPDATE 
   username = VALUES(username), 
   password = VALUES(password), 
   email = VALUES(email);

我想知道的是我将如何插入新用户。我应该只为UserId变量传递一个“0”或null,它会创建一个具有相应自动递增ID的新记录吗?关于如何在auto_increment中使用它的信息很少。

因为此当前语句提供错误“列数与第1行的值计数不匹配”。

如果我更改了用户的用户名,或者我输入了具有不同身份但用户名相同的用户,会发生什么?

修改 我想知道的是如何使用ON DUPLICATE KEY语句和一个auto_increment主键。问题是我不能只传递insert语句中的键,但是如果它已经存在,我还需要更新密钥。那么是否可以将ON DUPLICATE KEY与auto_increment primary一起使用?

2 个答案:

答案 0 :(得分:1)

问题在于您执行插入操作时不包含auto_incremented索引。

例如:

INSERT INTO users (`username`, `password`, `salt`, `email`)
VALUES('$username', '$password', '$salt', '$email')

这就是为什么列数与表不匹配的原因,因为它不期望你的auto_index在insert语句中,因此寻找另一列

答案 1 :(得分:0)

插入旧(已使用)自动增量ID可能是关系表中的安全漏洞。因此,即使可能,我也不建议这样做。