Можно ли иметь в таблице уникальный индекс переключения? - PullRequest
0 голосов
/ 17 апреля 2019

У меня есть сервер, который при входе в систему регистрирует их userID, IP, и, если IP уже существует в базе данных, он добавляет вхождение рядом с их IP и userID, как показано ниже. Дубликат ключа в настоящее время на UserID. Если я не ставлю ключ, то вместо того, чтобы обнаруживать, что строка с таким IP-адресом или идентификатором пользователя уже существует, она создает новую строку для каждого входа в систему, что вызывает много проблем.

Я попытался поставить дубликат ключа на IP, но если пользователь обращается к серверу с тем же IP-адресом, но с другим идентификатором пользователя, это добавит вхождение к IP-адресу исходного пользователя, так как IP-адрес уже существует и новый Идентификатор пользователя не будет добавлен в базу данных.

Структура таблицы:

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])

Мой обнадеживающий результат заключается в том, что он регистрирует каждый новый IP-адрес с соответствующим идентификатором пользователя, но если старый пользователь входит в систему с этим IP-адресом, он добавляет его как событие.

Спасибо!

1 Ответ

1 голос
/ 17 апреля 2019

Я не совсем уверен, что понимаю, что вы хотите, но я предполагаю, что вы хотите регистрировать каждую другую пару 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

...