mysql - 表中是否可以有切换 UNIQUE 索引?

标签 mysql mysql-python

我设置了一个服务器,在用户登录时记录其用户 ID、IP,如果该 IP 已存在于数据库中,则会在其 IP 和用户 ID 旁边添加一个出现,如下所示。重复的 key 当前位于 UserID 上。如果我没有输入任何 key ,那么它不会检测到具有该 IP 或 UserID 的行已经存在,而是为每次登录创建一个新行,这会导致很多麻烦。

我尝试将重复的 key 放在 IP 上,但如果用户使用相同的 IP 但不同的 UserID 访问服务器,则会在原始用户的 IP 中添加一个实例,因为该 IP 已存在并且新的 IP UserID 不会添加到数据库中。

表结构:

CREATE TABLE IF NOT EXISTS `ip_user` (
  `userid` int(11) NOT NULL,
  `ip` varchar(50) NOT NULL,
  `occurencies` int(11) NOT NULL,
  UNIQUE KEY `userid` (`userid`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

登录查询:

glob.db.execute("""INSERT INTO ip_user (userid, ip, occurencies) VALUES (%s, %s, 1)
ON DUPLICATE KEY UPDATE occurencies = occurencies + 1""", [userID, ip])

我希望的结果是它会使用相应的 UserID 记录每个新 IP,但如果旧用户使用该 IP 登录,它会将其添加为事件。

谢谢!

最佳答案

我不太确定我明白你想要什么,但我假设你想记录每个不同的 userId 和 Ip 对。 在这种情况下,您需要的是带有 userId 和 Ip 的唯一键(不确定 mysql 语法,抱歉):

CREATE TABLE IF NOT EXISTS `ip_user` (
`userid` int(11) NOT NULL,
`ip` varchar(50) NOT NULL,
`occurencies` int(11) NOT NULL,
UNIQUE KEY `userid_ip` (`userid`, `ip`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

编辑:此外,官方 mysql 文档在这方面可能会有所帮助:https://dev.mysql.com/doc/mysql/en/multiple-column-indexes.html

关于mysql - 表中是否可以有切换 UNIQUE 索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55730652/

相关文章:

Python MySQLdb 脚本在 OS X 上正常工作,复制到 Linux 服务器时出现权限被拒绝错误

python - Mysql查询不更新同一条记录

python - mysql-python 连接器同时适用于 python2.7 和 3.4

python - MySQLdb读取超时

php - MySQL:使用 ORDER BY 子句的查询不返回任何内容

mysql - 如何使用命令行将单个表导入mysql数据库

mysql - Docker 中的 Symfony 3 - 奇怪的连接拒绝错误

python - mysqldb编程错误

mysql - 在 Join 期间将文本转换为 int(转换?)

mysql - 连接 3 个表 MySQL