【发布时间】:2014-09-29 13:22:48
【问题描述】:
我一直在搜索 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 一起使用的信息很少。
因为这个当前语句给出了一个错误“Column count doesn't match value count at row 1”。
如果我更改用户的用户名,或者如果我输入的用户具有不同的 id 但用户名相同,会发生什么情况?
编辑 我想知道的是如何将 ON DUPLICATE KEY 语句与作为 auto_increment 的主键一起使用。问题是我不能只在插入语句中传递密钥,但如果密钥已经存在,我还需要更新密钥。那么是否可以将 ON DUPLICATE KEY 与 auto_increment 主节点一起使用?
【问题讨论】:
-
甚至不要在查询中指定
userId,将其留空(从语句中删除列和值)。另外,检查 mysql 想要执行的实际查询,如果可以的话,将其发布。 -
实际的查询比这要大一点。我为这个问题简化了它。但是,如果我删除 userId 列,如果用户已经存在,我将如何实际更新它?
-
因为用户名约束会失败。这将是重复的密钥。 auto_increment 不会产生重复。
-
但是用户名不是永久的。当用户更改其用户名时,它会创建不需要的新用户。
-
嗯,您是执行任务的人,而不是我们......您是这里的逻辑创建者。我不知道你的任务或目标是什么,所以如果你想要更多的 cmets 或答案 - 展开问题。
标签: mysql auto-increment insert-update on-duplicate-key