2012-04-20 3 views
1

У меня есть таблица с ips и количество раз, когда ip обращался к определенной странице. Я хочу добавить одну графу, если строка существует с IP, в противном случае создать строку с IP и установить счетчик на 1.MySql создать или обновить строку с помощью ip?

Я попытался

INSERT INTO mytable (ip,count) VALUES ('" + ip + "',1) ON DUPLICATE KEY UPDATE count=count+1; 

Но ф не является уникальным или primary, поэтому он просто создает строки с одним и тем же ip. Я пробовал сделать ip уникальным, но это не позволит мне. Когда я пытаюсь создать текстовый столбец и сделать его уникальным, phpmyadmin говорит BLOB/TEXT column 'test' used in key specification without a key length.

Я в порядке с использованием двух утверждений. Как я могу это сделать?

+0

Если вы хотите использовать 'UNIQUE', вам придется сначала нормализовать таблицу со всеми повторяющимися строками, прежде чем вы сможете запускать' ALTER' to ma ke столбец 'UNIQUE'. Вероятно, проще всего создать новую таблицу «SELECT INTO» с агрегированными результатами (например, 'SUM' и т. Д.), А затем« DROP »в старой таблице и переименовать таблицу tmp в имя старой таблицы. –

ответ

6

Изменение ip в UNSIGNED INT, создать UNIQUE ограничение на нем и использовать это:

INSERT 
INTO mytable (ip, count) 
VALUES (INET_ATON($ip), 1) 
ON DUPLICATE KEY 
UPDATE 
     count = count + 1 

Чтобы получить IP-адрес в точечно-десятичной нотации (например, 192.168.1.1), использование:

SELECT INET_NTOA(ip) 
FROM mytable 

You также может указывать индекс префиксов:

CREATE UNIQUE INDEX ux_mytaable_ip ON mytable (ip(15)) 

, но с использованием столбца INT предпочтительнее указать адрес ipv4.

+0

Является ли ip в формате unsigned int? – mowwwalker

+2

@Walkerneo: IPv4-адрес на самом деле является 32-разрядным номером. Вы можете использовать 'INET_NTOA' и' INET_ATON' для преобразования в и из десятичных знаков. – Quassnoi

+0

Ips в формате 123.456.78.8, хотя, что будет работать? – mowwwalker

0

Вам необходимо начать с выбора. (Псевдо-codish ответ - вам нужно настроить для вашего конкретного диалекта.)

Так делают

select count(*) from mytable 
where ip = $ip; 

Если возвращенное счетчик больше 0 сделать

update mytable 
set count = count + 1 
where ip = $ip 

еще

insert into mytable($ip, count, <other fields>...) values (ip, 1, <other values>...); 
Смежные вопросы