2012-04-20 61 views
1

我有一個ips表和ip訪問某個頁面的次數。我想補充一個,如果一排的IP所在的計數,否則會造成IP地址是行設置計數爲1MySql用ip創建或更新行?

我試圖

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

但IP不是唯一的或主要的,所以它只是不斷創建具有相同IP的行。我試圖讓ip獨特,但它不會讓我。當我嘗試創建文本列並使其具有唯一性時,phpmyadmin說BLOB/TEXT column 'test' used in key specification without a key length

我很好,使用兩個語句。我怎樣才能做到這一點?

+0

如果你想使用'UNIQUE',你必須首先用所有重複的行對錶格進行規格化,然後才能將'ALTER'運行到ma關注專欄'獨特'。可能最容易創建一個新表,'SELECT INTO'它帶有聚合結果(例如'SUM'等等),然後「DROP」舊錶並將tmp表重命名爲舊錶名。 – 2012-04-20 21:01:19

回答

6

變化ipUNSIGNED 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 

你也可以創建一個前綴索引:

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

但使用INT列來存儲ipv4地址是首選。

+0

是一個unsigned int格式的ip嗎? – mowwwalker 2012-04-20 20:56:42

+2

@Walkerneo:IPv4地址實際上是一個32位數字。您可以使用'INET_NTOA'和'INET_ATON'來轉換爲點分十進制表示法。 – Quassnoi 2012-04-20 20:59:55

+0

雖然Ips的格式爲123.456.78.8,但這樣會起作用嗎? – mowwwalker 2012-04-20 21:01:46

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>...);