【问题标题】:How to Create Unique Index for Existing table in MySQL which contains Records如何在 MySQL 中为包含记录的现有表创建唯一索引
【发布时间】:2016-01-26 11:15:41
【问题描述】:

在这里我想解释一下我的问题,

我需要在我的现有表中创建唯一索引,并且该表包含许多记录。

我试图执行这段代码

CREATE UNIQUE INDEX empid_name ON employee (importcompany_id, employee_id, name, relationship);

但我遇到了错误

#1062 - Duplicata du champ '0-Emp ID-Member Name-Relationship' pour la clef 'empid_name' 

帮我解决这个问题,我需要让字段唯一

更新:

设置这些字段唯一的原因是

其实我有这样一张桌子

id  company_ID  Employee_ID Name        Relationship    Dob     Age Gender       
1   EMPL        00001       Choodamani  Spouse      11-Aug-66   49  Female            
2   EMPL        00001       Komala      Mother      30-Oct-39   76  Female            
3   EMPL        00001       Varshini    Daughter    29-Apr-04   11  Female            
4   EMPL        00001       Vasudevan   Employee    15-Jul-62   53  Male    
5   EMPL        00002       Siddharth   Son         1-Jun-00    15  Male              
6   EMPL        00002       Poongavanam Mother      21-Oct-39   76  Female            
7   EMPL        00002       Aruna       Spouse      16-Sep-68   47  Female            
8   EMPL        00002       Abirami     Daughter    7-May-97    18  Female            
9   EMPL        00002       Murali      Employee    7-Oct-67    48  Male

如果有插入这样的数据,

    id  company_ID  Employee_ID Name        Relationship    Dob     Age Gender       
    1   EMPL        00001       Choodamani  Spouse      11-Aug-70   45  Female            
    2   EMPL        00001       Nirmal      Son      30-Oct-39   76  Female

此插入或更新是通过使用 excel 表导入完成的

【问题讨论】:

  • 您必须清理数据才能获得没有重复条目的表。之后,您将可以添加唯一索引。
  • 有什么方法可以做到不删除数据????
  • 我不明白。一种可能是拥有唯一的数据集,另一种可能是允许表中存在重复条目。如果要添加 UNIQUE INDEX 约束,则表中不能有重复的条目。请阅读dev.mysql.com/doc/refman/5.0/en/constraint-primary-key.html
  • 如果您包含“dob”(出生日期),那么您将获得更独特的表示。虽然它仍然不能保证完全的唯一性。

标签: php mysql indexing duplicates unique-index


【解决方案1】:
  1. 如果您想在具有列(importcompany_id, employee_id, name, relationship) 的员工表上创建唯一索引empid_name。然后您必须删除现有的重复数据。

执行此操作的简单方法是在 4 列上添加唯一索引。 编写 ALTER 语句时,请包含 IGNORE 关键字。像这样:

ALTER IGNORE TABLE `employee` ADD UNIQUE INDEX(importcompany_id, employee_id, name, relationship);

这将删除所有重复的行。作为一个额外的好处,未来的重复插入将出错。与往常一样,您可能需要在运行此类操作之前进行备份。

  1. 或者在您的表中添加主键,然后您可以轻松地从您的表中删除重复项。 然后添加唯一索引。

【讨论】:

  • 仅供参考,ALTER IGNORE 已被弃用。您必须首先删除 dups,然后设置唯一索引,然后您可以在没有忽略语句的情况下进行 ALTER
【解决方案2】:

为此使用alter table

 ALTER TABLE `employee` ADD UNIQUE INDEX(importcompany_id, employee_id, name, relationship);

更多参考请见this

【讨论】:

  • 通过使用您更新的答案,我收到此错误 #1062 - Duplicata du champ '0-Emp ID-Member Name-Relationship' pour la clef 'importcompany_id_3'跨度>
【解决方案3】:

最简单的解决方案是添加一个名为 UniqueID 之类的新列

如果您出于任何其他原因不需要它,您可以简单地将其设置为 AutoIncrement (AI):它将毫无意义,但至少它会是唯一的

然后您更改索引,以便 UniqueID 列是唯一/主键。如果您想维护员工的索引,您可以这样做,但如果您在该列中有多个具有相同值的记录,如果您将其指定为唯一,则会引发错误。

【讨论】:

  • 请看上面我已经更新了我的问题..这就是这样做的原因
  • 如果我理解正确,您的导入将更改 Choodamani 的 DOB(显然是年龄),并尝试为 Nirmal 插入记录。 (不确定 Nirmal 是 76 岁的女儿子,但这是另一个问题!)
  • 因此您的导入不能使用唯一 ID ...而是在相关字段上进行选择,确定它是 INSERT 还是 UPDATE 并允许表计算出正确的 ID(这就是自动增量确实)
  • 您的代码应该在第一次导入时确定存在具有相同 EmployeeID、名称和关系的现有记录 -> 更新。对于第二个,它将确定需要一条新记录 -> 插入。或者,在导入中包含已知记录的现有唯一 ID,如果导入中的 id 列为空,则插入,否则更新
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-12
  • 2011-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多