代码之家  ›  专栏  ›  技术社区  ›  yAnTar Arun P Johny

如何将唯一键添加到现有表(具有非唯一行)

  •  84
  • yAnTar Arun P Johny  · 技术社区  · 11 年前

    我想将复杂的唯一键添加到现有表中。密钥包含4个字段( user_id , game_id , date , time ). 但表有非唯一的行。 我知道我可以删除所有重复的日期,然后添加复杂的密钥。

    也许存在另一种不搜索所有重复数据的解决方案。(如添加唯一忽略等)。

    更新 我搜索了一下,如何删除重复的mysql行——我认为这是一个很好的解决方案。 Remove duplicates using only a MySQL query?

    8 回复  |  直到 1 年前
        1
  •  154
  •   Mohamed Nuur    5 年前

    你可以按照安塔尔的建议去做

    ALTER TABLE TABLE_NAME ADD Id INT AUTO_INCREMENT PRIMARY KEY
    

    可以添加约束

    ALTER TABLE TABLE_NAME ADD CONSTRAINT constr_ID UNIQUE (user_id, game_id, date, time)
    

    但我认为为了不丢失现有的数据,可以添加一个缩进列,然后制作一个复合键。

        2
  •  32
  •   Shubham Dixit    5 年前

    正确的语法应该是- ALTER TABLE Table_Name ADD UNIQUE (column_name)

    实例

    ALTER TABLE  0_value_addition_setup ADD UNIQUE (`value_code`)
    
        3
  •  11
  •   Raj    11 年前

    我不得不解决一个类似的问题。我从MS Access继承了一个大型源表,其中有近15000条记录没有主键,我必须对主键进行规范化并使CakePHP兼容。CakePHP的一个约定是,每个表都有一个主键,它是第一列,它被称为“id”。以下简单的语句在MySQL 5.5下帮了我一把:

    ALTER TABLE `database_name`.`table_name` 
    ADD COLUMN `id` INT NOT NULL AUTO_INCREMENT FIRST,
    ADD PRIMARY KEY (`id`);
    

    这在现有数据前面添加了一个integer类型的新列“id”(“FIRST”关键字)。AUTO_INCREMENT关键字将ID从1开始递增。现在,每个数据集都有一个唯一的数字id。(如果没有AUTO_INCREMENT语句,所有行都填充id=0)。

        4
  •  3
  •   prakash kumar    6 年前

    在表中设置多个唯一键

    ALTER TABLE table_name
    ADD CONSTRAINT UC_table_name UNIQUE (field1,field2);
    
        5
  •  3
  •   bertdida    3 年前

    我提供的解决方案基于您的业务逻辑。基本上,在我的设计中,我将允许表只存储一个用户游戏组合的记录。因此,我将向表中添加一个复合键。

    PRIMARY KEY (`user_id`,`game_id`)
    
        6
  •  2
  •   Hituptony    11 年前

    创建一个自动递增id或一个UNIQUE id,并将其添加到您正在讨论的4个字段的自然键中。这将使表中的每一行都是唯一的。。。

        7
  •  0
  •   Vette    5 年前

    对于MySQL:

    ALTER TABLE MyTable ADD MyId INT AUTO_INCREMENT PRIMARY KEY;
    
        8
  •  0
  •   Tona Dinh    3 年前

    如果你的ColumnName有一些不唯一的值,现在你想为它添加一个唯一的索引。试试这个:

    CREATE UNIQUE INDEX [IDX_Name] ON yourTableName (yourColumnName) WHERE [id]>1963 --1963 is max(id)-1
    

    现在,尝试插入一些已经存在的值进行测试。