visitors table
-------------------------------------------------------
id(auto_incr.) | ip | isp | count | time | (isp_id)
-------------------------------------------------------
我有这个MySQL表,它拥有所有唯一的IP地址和IP访问我网站的次数,包括其他IP信息,如ISP,时间等。
如何添加另一个名为 isp_id 的列,这对于每个ISP都是唯一的?
例如,如果特定ISP存在10次,则这些ISP的isp_id将相同,如果另一个ISP存在2次,则isp_id将增加1。
我怎样才能做到这一点?
抱歉我的英语不好。我来自阿尔巴尼亚。
答案 0 :(得分:2)
涉及多个查询,您可以在此处看到演示: http://sqlfiddle.com/#!2/e87cd/1/0
简而言之,第1步是创建一个表来保存ISP(每个ISP一行):
create table isps (
id int not null auto_increment,
isp_name varchar(20),
primary key (id)
);
您希望根据访问者表中当前的ISP填充该表,如下所示:
insert into isps
(isp_name)
select distinct isp from visitors;
然后将一个isp_id列添加到您的VISITORS表中,如下所示:
alter table visitors add column isp_id int;
然后更新您的VISITORS表以包含与ISPS表的行相关联的ISP_ID值:
update visitors v
set v.isp_id =
(select i.id from isps i where i.isp_name = v.isp);
执行上述操作后,我建议删除VISITORS表的当前ISP列,并仅保留上面刚刚添加的ISP_ID字段。您始终可以加入ISPS表以获取给定ISP_ID的名称。
要做到这一点,请运行:
alter table visitors drop column isp;
正如您所看到的那样,只需加入此点就很容易了,而且您不再拥有冗余数据,例如:http://sqlfiddle.com/#!2/1e7d6/1/0
答案 1 :(得分:1)
更好的方法是创建一个单独的ISP表,其中包含唯一的isp_id和isp的名称。
CREATE TABLE ispTable(isp_id int auto_increment,isp_Name varchar(100));
现在您不必在问题中发布的visitors
表中存储isp名称,在表中输入时只插入isp_id
,如果需要,您可以使用join获取isp的名称表之间基于isp_id
visitors table
---------------------------------------------
id(auto_incr.) | ip | count | time | isp_id
---------------------------------------------
注意:isp列已从访问者表中删除。
答案 2 :(得分:1)
我想我会将isp
作为另一个表的外键 - 可能称为“isps”。我认为步骤是:
#1这样的事情:
CREATE TABLE IF NOT EXISTS isps (
id INT NOT NULL AUTO_INCREMENT,
PRIMARY KEY (id),
KEY(isp_name)
) SELECT DISTINCT isp_name FROM visitors;
对于#2:
ALTER TABLE visitors ADD COLUMN isp_id INT;
对于#3:
UPDATE visitors v
JOIN isps i ON v.isp = i.isp_name
SET v.isp_id = i.id;
对于#4:
ALTER TABLE visitors
ADD CONSTRAINT fk_ispID
FOREIGN KEY (isp_id) REFERENCES isps(id);
最后,#5:
ALTER TABLE visitors DROP COLUMN isp;
注意:没有这个已经过测试,我没有查找语法,所以请以它为例。复制/粘贴可能会让您陷入困境。
此外,一旦完成此操作,您将不得不更新为访问者添加行的所有代码,并且您还必须添加代码以在新ISP进入时维护isps。