如果我在数据库中有以下列:
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
我建议您使用整数作为值 - 而不是字符串。然后,您可以使用变量作为赋值:
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;
如果您使用的是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;
我建议可能只是在表中添加一个自动增量列,但这不符合您的要求,因为自动增量列始终是唯一的。
这就是我要做的......
email
列创建一个新表
CREATE TABLE `emails` (
id INT(3) PRIMARY KEY AUTO_INCREMENT,
email VARCHAR(255) UNIQUE
);
INSERT INTO `emails` (`email`)
SELECT DISTINCT `email` FROM `some_mystery_table`
ORDER BY `email`;
emails(id)
作为外键引用。这可能有点棘手,因为你需要(可能)
如果需要,添加一个新的int
列email_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)
的地方添加一个外键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;
emails
,然后在任何其他相关表中使用生成的id
。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来填零。