【问题标题】:MySQL: Creating new unique field in already populated tableMySQL:在已填充的表中创建新的唯一字段
【发布时间】:2012-01-04 20:30:59
【问题描述】:

我需要在已填充数据的数据库表中创建一个字段。当然,仅将字段添加为空是不可能的。我只能想到用新的结构创建一个新表并将现有数据复制到新表中,但我想知道是否有更简单的方法。

提示:它是一个复合键,由同一张表中的 3 个其他字段组成。

编辑:该字段包含一个 varchar 值 编辑:因为你们中的一些人问,不可能仅通过使用 ADD UNIQUE 在填充表中创建新的 UNIQUE 字段。它在所有条目中复制新的(无论是否为空)值。示例:

ALTER TABLE 'tablename' ADD 'fieldname' VARCHAR( 64 ) NOT NULL , 添加唯一( '字段名' )

错误:键 'fieldname' 的重复条目 ''

【问题讨论】:

  • 为什么不能创建字段然后用数据填充它?
  • @Robert 因为它的值(是否为空)将在所有条目中重复。由于它是唯一键,因此这是不可能的。
  • @JasonMcCreary 是的,还有另一个唯一键(auto_increment)。
  • 好吧,如果(空)值重复,为什么不行呢?您可以先添加没有键的字段(空的,重复的),然后执行 UPDATE 以使其真正唯一,然后才通过单独的语句创建键。

标签: mysql database


【解决方案1】:

当然,只是将字段添加为空是不可能的。

为什么?

我会做以下事情:

  1. ALTER TABLE t ADD COLUMN new_column *type_definition*创建字段
  2. 更新新创建的字段,如UPDATE t SET new_column=*computation_expression*
  3. 通过ALTER TABLE t ADD INDEX ...(或ALTER TABLE t ADD PRIMARY KEY ...,如果您需要它作为主要索引)添加索引。

【讨论】:

    【解决方案2】:

    提示:它是一个复合键,由同一张表中的 3 个其他字段组成。

    这对我来说听起来像是一个危险信号。您想创建一个具有唯一约束的新字段,该约束由同一个表中已存在的 3 个其他字段的值组成?

    如果您只想强制这三个字段的组合是唯一的,那么您应该对这三个现有字段添加唯一约束(而不是具有重复数据的新字段)。

    ALTER TABLE tablename ADD UNIQUE (fieldname1, fieldname2, fieldname3);
    

    【讨论】:

      【解决方案3】:

      您可以使用AUTO_INCREMENT 选项创建一个新字段:

      ALTER TABLE `your_table` ADD COLUMN `new_id` INT NOT NULL AUTO_INCREMENT  
      

      【讨论】:

        【解决方案4】:

        这是一种可能的解决方法:

        alter table foo add bar varchar(36) not null default '';
        

        然后按照default value of GUID in for a column in mysql添加触发器

        【讨论】:

          【解决方案5】:

          我遇到了同样的问题,我必须在已填充的表上添加唯一约束。

          错误:

          Integrity constraint violation: 1062 Duplicate entry '' for key 'url_UNIQUE'
          

          我是怎么解决的?我将行的 id 放入唯一字段以避免重复:

          UPDATE content SET new_url = content_id WHERE new_url = '';
          

          然后我不再有任何重复的行,并且能够添加唯一约束。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2015-03-01
            • 2012-04-15
            • 1970-01-01
            • 1970-01-01
            • 2013-08-11
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多