mysql - 即使新值等于现有主键也能够输入多个值

标签 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` datetime NOT NULL,
  PRIMARY KEY (`userID`,`userName`) USING BTREE
) 

但是,当我运行这个查询时:

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

它插入多行用户名为 Joe 的行,即使这是一个主键。我想是因为userID和userName都是主键,只有两者匹配才是关键。但是,我无法删除 userID 上的主键,因为 mysql 会抛出错误。我希望 userName 是不同的,因此每个 userName 只有一个记录,并且我希望 replace 语句在 userName 已经存在的情况下只更新 lastUpdatedDate(如果不存在则插入它)。我怎样才能做到这一点?

最佳答案

你是正确的 userID 和 userName 一起构成了主键。您的 replace into 会自动创建 userID 值,从而创建有效的唯一键

(1,joe)
(2,joe)
....

发出这个

ALTER TABLE `mydb`.`users` ADD CONSTRAINT UNIQUE uniqueusername (`userName`);

这会在您的表上添加所需的约束。除了 (userID,userName) 作为主键之外,现在 userName 列本身只能包含唯一值。

您可以使用此查询并获得所需的行为(它会在用户名存在时更新 lastUpdatedDate 和 active,否则会插入一个新条目,其中 lastUpdatedDate 和 createdDate 设置为 now())。

INSERT INTO `users` (`userName`, `createdDate`, `active`, `lastUpdatedDate`)
VALUES ('Joe', now(), 1, now())
ON DUPLICATE KEY UPDATE `lastUpdatedDate` = now(), active = 1;

关于mysql - 即使新值等于现有主键也能够输入多个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1691371/

相关文章:

java - while循环不退出

php - 将自动递增主键插入到另一个表中的线程安全方法(以便稍后可以将它们连接起来)

PostgreSQL:主键

PhpMyAdmin 自动刷新 MySQL 表

Mysql 包含没有针对特定日期返回行的列

MySQL 用其他表中的名称替换 ID

search - vim 从光标的当前位置搜索并替换到指定的标记

postgresql - 如何在 PostgreSQL 中向现有表添加自动递增主键?

php - 在 php 脚本末尾关闭和/或终止 mysqli 连接?

sql - MYSQL一对多JOIN