MYSQL:根据另一列创建唯一ID

问题描述 投票:0回答:4

如果我在数据库中有以下列:

Email 
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]

我想更改表并根据“电子邮件”列创建一个唯一的ID列。如下:

Email           Email_ID
[email protected]   001
[email protected]   002
[email protected]   003
[email protected]   002
[email protected]   004
[email protected]   001
mysql sql
4个回答
2
投票

我建议您使用整数作为值 - 而不是字符串。然后,您可以使用变量作为赋值:

alter table t add email_id int;

update t join
       (select email, (@rn := @rn + 1) as rn
        from (select distinct email from t order by email) t cross join
             (select @rn := 0) params
       ) tt
       on t.email = tt.email
    set t.email_id = tt.rn;

如果运行子查询,您将看到这为每个电子邮件分配了一个不同的数字。

外部查询然后将此数字分配到email_id列。在MySQL 8+中,您还可以编写:

alter table t add email_id int;

update t join
       (select email, row_number() over (order by email) as rn
        from (select distinct email from t order by email) t 
       ) tt
       on t.email = tt.email
    set t.email_id = tt.rn;

1
投票

如果您使用的是MySQL 8或更高版本,那么DENSE_RANK在这里提供了一个不错的选择:

SELECT
    Email,
    LPAD(CAST(DENSE_RANK() OVER (ORDER BY Email) AS CHAR(3)), 3, '0') AS Email_ID
FROM yourTable
ORDER BY
    Email;

我建议可能只是在表中添加一个自动增量列,但这不符合您的要求,因为自动增量列始终是唯一的。


1
投票

这就是我要做的......

  1. 使用唯一的email列创建一个新表 CREATE TABLE `emails` ( id INT(3) PRIMARY KEY AUTO_INCREMENT, email VARCHAR(255) UNIQUE );
  2. 用你当前的数据播种它 INSERT INTO `emails` (`email`) SELECT DISTINCT `email` FROM `some_mystery_table` ORDER BY `email`;
  3. 更改现有表以将emails(id)作为外键引用。这可能有点棘手,因为你需要(可能) 如果需要,添加一个新的intemail_id 使用与电子邮件地址对应的id值更新您的数据 UPDATE some_mystery_table, emails INNER JOIN emails ON some_mystery_table.email = emails.email SET some_mystery_table.email_id = emails.id; 删除email列 在email_id引用emails(id)的地方添加一个外键
  4. 在显示您的数据并且您需要零填充电子邮件id时,请加入emails表,例如 SELECT a.whatever, e.email, LPAD(e.id, 3, '0') AS email_id FROM some_mystery_table a INNER JOIN emails e ON a.email_id = e.id;
  5. 添加新电子邮件记录时,首先将它们添加到emails,然后在任何其他相关表中使用生成的id

0
投票
ALTER TABLE emails add column `email_id` int(5) ZEROFILL PRIMARY KEY AUTO_INCREMENT;
SET @x:=0;
UPDATE emails SET email_id = LPAD(@x:= (@x+1),4, '0') WHERE 1=1;

我们首先将列email_id添加到表emails并使用此查询将其设置为主键:

ALTER TABLE emails add column `email_id` int(5) ZEROFILL PRIMARY KEY AUTO_INCREMENT;

然后我们声明了一个名为x的全局变量,默认值为0:

SET @x:=0;

最后,我们用增量零填充id填充列:

UPDATE emails SET email_id = LPAD(@x:= (@x+1),4, '0') WHERE 1=1;

我们用LPAD来填零。

© www.soinside.com 2019 - 2024. All rights reserved.