在Mysql中使用行索引和硬编码值更新整个列的方法
P粉362071992
P粉362071992 2023-08-26 15:24:30
0
2
344

我想使用行索引+email@gmail.com的格式更新整个email列。

这是我的表中的数据

id 电子邮件
12 abc@gmail.com
23 pqr@gmail.com

这是我想要的输出

id 电子邮件
12 1email@gmail.com
23 2email@gmail.com

我尝试了下面的查询,但没有得到我期望的输出。

;with C as ( select email,row_number() over(order by id asc) as rowid from cus ) update C set email = rowid+'email@gmail.com'

这不仅仅是3行,我的cus表中有超过500行。如果有人可以给我一个不需要循环的解决方案,那将更好。请帮我创建一个SQL查询。谢谢。

P粉362071992
P粉362071992

全部回复 (2)
P粉201448898

这似乎有效,但我相信还有一种更优雅的解决方案,不需要使用join...

SELECT * FROM cus ; update cus inner join ( select id ,email,row_number() over(order by id asc) as rowid from cus )a on a.id = cus.id set cus.email = concat(a.rowid, a.email) ; SELECT * FROM cus ;

完整测试

-- 创建表 CREATE TABLE cus ( id INTEGER PRIMARY KEY, email TEXT NOT NULL ); -- 插入数据 INSERT INTO cus VALUES (0021, 'Clark'); INSERT INTO cus VALUES (0402, 'Dave'); INSERT INTO cus VALUES (005, 'Ava' ); SELECT * FROM cus ; update cus inner join ( select id ,email,row_number() over(order by id asc) as rowid from cus )a on a.id = cus.id set cus.email = concat(a.rowid, a.email) ; SELECT * FROM cus ;
    P粉885035114

    也许这就是你想要做的:

    WITH C AS ( SELECT email,ROW_NUMBER() OVER(ORDER BY id ASC) AS rowid FROM cus ) UPDATE cus JOIN C ON cus.email=C.email SET cus.email=CONCAT(rowid,'email@gmail.com');

    将你想要更新的表(cus)与Ccte进行连接,然后进行相应的更新。

    这里有一个演示

    @QisM对于email不唯一时的语法提出了疑虑,由于OP没有提到,我同意如果email确实不唯一,这不是解决方案。因此,我对语法进行了轻微修改:

    WITH C AS ( SELECT id, email, ROW_NUMBER() OVER(ORDER BY id ASC) AS rowid FROM cus ) UPDATE cus JOIN C ON cus.id=C.id AND cus.email=C.email SET cus.email=CONCAT(rowid,'email@gmail.com');

    现在cte带有id,并且在JOIN C ON ..条件中,我添加了匹配id的检查。经过测试,如果电子邮件不唯一,这将修复该问题

      最新下载
      更多>
      网站特效
      网站源码
      网站素材
      前端模板
      关于我们 免责声明 Sitemap
      PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!