【问题标题】:Adding new field with Unique key index in existing MySQL table在现有 MySQL 表中添加具有唯一键索引的新字段
【发布时间】:2014-08-30 11:40:59
【问题描述】:

我正在尝试在包含多行数据的现有 MySQL 表中添加具有唯一键的列(因此它不会有重复的记录)。

ALTER TABLE  `common`.`fraud_payment_log`
  ADD  `retainer_id` VARCHAR( 20 ) NOT NULL,
  ADD  `http_referrer` VARCHAR( 255 ) NULL ,
  ADD UNIQUE (`retainer_id`);

但它抛出以下错误:

ERROR 1062 (23000): Duplicate entry '' for key 'retainer_id'

错误是因为我们在现有表中添加新列时会出现重复的空值。

谁能建议如何实现这一点?

【问题讨论】:

标签: mysql


【解决方案1】:

您不能将唯一的非 NULL 列添加到包含多行的表中。根据定义,两行将获得相同的值。

先添加列,允许 NULL 值:

ALTER TABLE  `common`.`fraud_payment_log`
    ADD  `retainer_id` VARCHAR( 20 ) NULL,
    ADD  `http_referrer` VARCHAR( 255 ) NULL;

现在,填充列,使其具有不同的值。说:

update `common`.`fraud_payment_log` cross join
       (select @rn := 0) vars
     set retainer_id = (@rn := @rn + 1);

然后添加唯一约束。我通常直接用索引来做这个:

create unique index idx_fpl_retainer on  `common`.`fraud_payment_log`(retainer_id);

如果表格为空,则只需重新创建包含所有您想要的列的表格。

【讨论】:

    【解决方案2】:

    按照以下步骤操作:

    • 添加不唯一的新字段
    • 更新表格并将唯一值放入该字段中
    • 更改表格以使该字段具有唯一性

    【讨论】:

      【解决方案3】:

      您应该首先添加列,然后使用唯一值填充它,然后添加 UNIQUE 约束。

      【讨论】:

        【解决方案4】:

        你应该指定一个DEFAULT NULL; NULL 不计入 UNIQUE 检查,因此您的表将首先填充 NULL 值,然后您将继续按照您的意愿填充它。

        【讨论】:

          【解决方案5】:
          1. 使用 UI 或查询创建新列(我的新列是 sensorID
          2. 开火:

          更新客户端设置 sensorID=id

          1. 在上面的查询中 client 是我的表,sensorID 是我新添加的列,我想在其上应用唯一列,id 是我的主要现有表中的键类型列。

          【讨论】:

            猜你喜欢
            • 2013-02-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-10-31
            • 2011-03-27
            • 2018-03-09
            • 1970-01-01
            相关资源
            最近更新 更多