我一直在寻找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一起使用?
答案 0 :(得分:1)
问题在于您执行插入操作时不包含auto_incremented索引。
例如:
INSERT INTO users (`username`, `password`, `salt`, `email`)
VALUES('$username', '$password', '$salt', '$email')
这就是为什么列数与表不匹配的原因,因为它不期望你的auto_index在insert语句中,因此寻找另一列
答案 1 :(得分:0)
插入旧(已使用)自动增量ID可能是关系表中的安全漏洞。因此,即使可能,我也不建议这样做。