在现有MySQL表中添加唯一ID

时间:2014-07-27 23:55:29

标签: mysql

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。

我怎样才能做到这一点?

抱歉我的英语不好。我来自阿尔巴尼亚。

3 个答案:

答案 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. 创建并填充表“isps”
  2. 将“isp_id”添加为“可访问”的整数列到“visitor”
  3. 从“isps”
  4. 中的数据填充visitor.isp_id
  5. 使visitor.isp_id NOT NULL和外键
  6. 从“visitor”
  7. 中删除原始字符串列
  8. 利润!
  9. #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。