【问题标题】:Adding Unique primary key to table with 100,000 redundant records向具有 100,000 条冗余记录的表添加唯一主键
【发布时间】:2017-01-22 21:00:24
【问题描述】:

我有一个包含超过 100,000 条用户记录且没有主键的数据库。您能否向我解释一下我将如何完成以下任务: 1.根据Firstname MiddleName LastName自动生成主键。 2. 请注意,有些记录是冗余的,即相同的用户,我希望相同的用户具有相同的主键,例如 Mary Jane Joe 在行中出现 20 次,我希望她在所有出现中都具有相同的主键。 提前致谢

【问题讨论】:

  • 为什么不删除重复项,然后添加一个自动增量int 键?
  • 那它不是主键
  • @Bohemian...如何删除重复项,因为它是一个大型数据库??
  • 您可以使用 OPTION IGNORE 创建复合唯一键/主键,然后 MySQL 删除所有重复项
  • 行“冗余”是否仅基于名称?还是在行的所有列上?

标签: mysql database-design foreign-key-relationship


【解决方案1】:

最佳选择

通过添加具有自动增量的非空 int 字段来使用真正唯一的主键。这将自动给每条记录一个唯一的主键。如果您仍想将上述字段用作唯一字段,我会在字段之间添加一个复合唯一键。

这样做的主要好处之一是整数字段的查询速度比 varchar 快得多。话虽如此,您的表只有 100,000 条记录,因此目前可以忽略不计。

备用

如果您仍想使用您定义的键,那么您有几个选项都具有相同的过程。

  1. 向您的表中添加一个可以为空的常规 varchar 字段,而不是主键(like this)
  2. 查找重复项并将其删除
  3. 遍历每条记录并根据您描述的值创建主键,并使用该键更新第 1 步中定义的当前记录字段。
  4. 更改表以添加您的主键 (like this)

不过我必须提醒您,听起来您对主键的想法并不是真正唯一的,这违背了主键的目的。

【讨论】:

    【解决方案2】:

    使用 auto-inc(如果需要)和名称的唯一性约束构建新表:

    CREATE TABLE new (
        id INT UNSIGNED AUTO_INCREMENT,
        PRIMARY KEY(id),
        UNIQUE(Firstname, MiddleName, LastName)
    );
    

    将所有非重复行复制到该表中。 (假设“dup”只涉及 3 列,而不仅仅是名称。)

    INSERT IGNORE INTO new
                       (Firstname MiddleName LastName, ...)
        SELECT DISTINCT Firstname MiddleName LastName, ...
            FROM real;
    

    切换表(如果需要):

    RENAME TABLE real TO old, new TO real;
    DROP TABLE old;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-14
      • 1970-01-01
      • 2013-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多