首頁  >  問答  >  主體

在Mysql中使用行索引和硬編碼值更新整個列的方法

<p>我想使用行索引 email@gmail.com的格式更新整個<strong>email</strong>列。 </p> <p>這是我的表中的數據</p> <table class="s-table"> <thead> <tr> <th>id</th> <th>電子郵件</th> </tr> </thead> <tbody> <tr> <td>12</td> <td>abc@gmail.com</td> </tr> <tr> <td>23</td> <td>pqr@gmail.com</td> </tr> </tbody> </table> <p>這是我想要的輸出</p> <table class="s-table"> <thead> <tr> <th>id</th> <th>電子郵件</th> </tr> </thead> <tbody> <tr> <td>12</td> <td>1email@gmail.com</td> </tr> <tr> <td>23</td> <td>2email@gmail.com</td> </tr> </tbody> </table> <p>我嘗試了下面的查詢,但沒有得到我期望的輸出。 </p> <pre class="brush:php;toolbar:false;">;with C as ( select email,row_number() over(order by id asc) as rowid from cus ) update C set email = rowid 'email@gmail.com'</pre> <p>這不只是3行,我的<code>cus</code>表格中有500多行。如果有人可以給我一個不需要循環的解決方案,那會更好。請幫我建立一個SQL查詢。謝謝。 </p>
P粉362071992P粉362071992392 天前382

全部回覆(2)我來回復

  • P粉201448898

    P粉2014488982023-08-27 14:25:34

    這似乎有效,但我相信還有一個更優雅的解決方案,不需要使用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 ;

    回覆
    0
  • P粉885035114

    P粉8850351142023-08-27 00:04:35

    也許這就是你想要做的:

    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的檢查。經過測試,如果電子郵件不唯一,這將修復該問題

    回覆
    0
  • 取消回覆