mysql-即使新值等于现有主键,也可以输入多个值

mysql-即使新值等于现有主键,也可以输入多个值,mysql,replace,primary-key,Mysql,Replace,Primary Key,我有一个定义如下的表格: CREATE TABLE `mydb`.`users` ( `userID` int(10) unsigned NOT NULL AUTO_INCREMENT, `userName` varchar(100) COLLATE utf8_unicode_ci NOT NULL, `createdDate` datetime NOT NULL, `active` tinyint(1) NOT NULL, `lastUpdatedDate` dateti

我有一个定义如下的表格:

CREATE TABLE  `mydb`.`users` (
  `userID` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `userName` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
  `createdDate` datetime NOT NULL,
  `active` tinyint(1) NOT NULL,
  `lastUpdatedDate` datetime NOT NULL,
  PRIMARY KEY (`userID`,`userName`) USING BTREE
) 
但是,当我运行此查询时:

REPLACE INTO users SET userName ='Joe', active=1, lastUpdatedDate=now()

它插入多个带有用户名Joe的行,即使这是主键。我认为,因为userID和userName都是主键,所以只有当两者匹配时才是主键。但是,我无法删除userID上的主键,因为mysql抛出了一个错误。我希望用户名是不同的,因此每个用户名只有一条记录,如果用户名已经存在,我希望replace语句只更新lastUpdateDate(如果不存在,则插入它)。我如何才能做到这一点?

您是正确的用户ID,用户名一起构成主键。替换为自动创建userID值,从而创建有效的唯一键

(1,joe)
(2,joe)
....
发布此

ALTER TABLE `mydb`.`users` ADD CONSTRAINT UNIQUE uniqueusername (`userName`);
这会在表上添加所需的约束。除了(
userID
userName
)现在是主键之外,userName列本身只能包含唯一的值

您可以使用此查询并获取所需的行为(当用户名存在时,它会更新LastUpdateDate和active,否则会插入LastUpdateDate和createdDate设置为now()的新条目)


您是正确的用户ID和用户名一起构成主键。替换为自动创建userID值,从而创建有效的唯一键

(1,joe)
(2,joe)
....
发布此

ALTER TABLE `mydb`.`users` ADD CONSTRAINT UNIQUE uniqueusername (`userName`);
这会在表上添加所需的约束。除了(
userID
userName
)现在是主键之外,userName列本身只能包含唯一的值

您可以使用此查询并获取所需的行为(当用户名存在时,它会更新LastUpdateDate和active,否则会插入LastUpdateDate和createdDate设置为now()的新条目)


你回答了自己的问题,我想——用户名不是“a”主键,用户名是主键的一部分。看起来你想要的是:

CREATE TABLE  `mydb`.`users` (
`userID` int(10) unsigned NOT NULL AUTO_INCREMENT,
`userName` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
`createdDate` datetime NOT NULL,
`active` tinyint(1) NOT NULL,
`lastUpdatedDate` datetime NOT NULL,
PRIMARY KEY (`userID`) USING BTREE
UNIQUE KEY (`userName`)
)

(未检查语法)

我认为您回答了自己的问题——用户名不是“a”主键,用户名是主键的一部分。看起来你想要的是:

CREATE TABLE  `mydb`.`users` (
`userID` int(10) unsigned NOT NULL AUTO_INCREMENT,
`userName` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
`createdDate` datetime NOT NULL,
`active` tinyint(1) NOT NULL,
`lastUpdatedDate` datetime NOT NULL,
PRIMARY KEY (`userID`) USING BTREE
UNIQUE KEY (`userName`)
)

(未选中语法)

首先,检查表中是否有重复的id

select userName
from users
group by userName
having count(*) > 1
删除行,直到没有重复的行。然后,删除现有的主键:

alter table users drop primary key
并重新创建您想要的主键:

alter table users add primary key (userName)

现在应该可以了,因为不再有多行具有相同用户名。

首先,检查您的表中是否有重复的id

select userName
from users
group by userName
having count(*) > 1
CREATE TABLE  `mydb`.`users` (
  `userID` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `userName` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
  `createdDate` datetime NOT NULL,
  `active` tinyint(1) NOT NULL,
  `lastUpdatedDate` datetime NOT NULL,
  PRIMARY KEY (`userId`) USING BTREE,
  UNIQUE KEY (`userName`)
)
删除行,直到没有重复的行。然后,删除现有的主键:

alter table users drop primary key
并重新创建您想要的主键:

alter table users add primary key (userName)
现在应该可以了,因为不再有多行具有相同的用户名

CREATE TABLE  `mydb`.`users` (
  `userID` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `userName` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
  `createdDate` datetime NOT NULL,
  `active` tinyint(1) NOT NULL,
  `lastUpdatedDate` datetime NOT NULL,
  PRIMARY KEY (`userId`) USING BTREE,
  UNIQUE KEY (`userName`)
)
需要注意的是,REPLACE实际上会删除该行并添加一个新行。这将产生一个新的用户ID(由于自动增量)


需要注意的是,REPLACE实际上会删除该行并添加一个新行。这将产生一个新的用户ID(由于自动增量)

我删除了表中的所有数据,但当我运行第一个alter命令删除主键时,我收到以下消息:错误1075(42000):表定义不正确;只能有一个“自动”列,并且必须将其定义为一个键,根据Tjofras的回答(),它将生成一个新的用户ID。@David Buckley:有趣。也许您可以删除或更改id列以删除自动增量,但由于您已经删除了所有数据,您可以删除并重新创建表。您不能删除主键,因为自动增量字段必须是键。如果你真的想让用户名成为主键,你需要首先通过运行“alter table users add KEY(userID)”向表中添加一个常规键。键只是索引的同义词吗?我删除了表中的所有数据,但当我运行第一个alter命令删除主键时,我收到以下消息:错误1075(42000):表定义不正确;只能有一个“自动”列,并且必须将其定义为一个键,根据Tjofras的回答(),它将生成一个新的用户ID。@David Buckley:有趣。也许您可以删除或更改id列以删除自动增量,但由于您已经删除了所有数据,您可以删除并重新创建表。您不能删除主键,因为自动增量字段必须是键。如果您真的想让用户名成为PK,您需要首先通过运行“alter table users add KEY(userID)”向表中添加一个常规键。键只是索引的同义词吗?这是因为现在每个用户名只有一条记录,但当我运行REPLACE INTO命令时,userID字段会更新。我希望它与我第一次插入记录时一样,只是更改了LastUpdateDate值。这是不可能的吗?更改了查询以在用户存在时不更改userID和createdDate,而只更新lastUpdateDate和active。您应该能够采用此查询来满足您的特定需求。这是因为现在每个用户名只有一条记录,但是当我运行REPLACE-INTO命令时,userID字段会更新。我希望它与我第一次插入记录时一样,只是更改了LastUpdateDate值。这是不可能的吗?更改了查询以在用户存在时不更改userID和createdDate,而只更新lastUpdateDate和active。您应该能够采用此查询以满足您的特定需求。在不更改用户ID的情况下,是否无法仅更新LastUpdateDate?实际上,有一篇有趣的博客文章介绍了REPLACE的真正功能。。也许不是你所想的那样:那么,在不更改用户ID的情况下更新LastUpdateDate就没有办法了吗?事实上,有一篇关于REPLACE的有趣博文。。也许不是你想的那样: