表中是否可以有一个切换UNIQUE索引?

时间:2019-04-17 15:00:46

标签: mysql mysql-python

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

我尝试将重复密钥放在IP上,但是如果用户使用相同的IP但使用不同的UserID访问服务器,则会在原始用户的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登录,则将其添加为出现。

谢谢!

1 个答案:

答案 0 :(得分:1)

我不太确定我了解您想要什么,但是我假设您想记录每个不同的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 documentacion在这方面可能会有所帮助:https://dev.mysql.com/doc/mysql/en/multiple-column-indexes.html