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

Is it possible to have a switching UNIQUE index within a table?

我设置了一个服务器,在用户登录时记录他们的用户 ID、IP,如果 IP 已经存在于数据库中,它会在他们的 IP 和用户 ID 旁边添加一个事件,如下所示。重复键当前在 UserID 上。如果我不输入密钥,那么它不会检测到具有该 IP 或用户 ID 的行已经存在,而是为每次登录创建一个新行,这会造成很多麻烦。

我已经尝试将重复的密钥放在 IP 上,但是如果用户使用相同的 IP 但使用不同的用户 ID 访问服务器,它会在原始用户的 IP 中添加一个事件,因为 IP 已经存在并且新的 UserID 不会添加到数据库中。

Table结构:

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