簡體   English   中英

mysql如何使用給定的一組值更新每一行的列

[英]mysql how to update a column of every row with a given set of values

我想用一組給定值中的值更新表的每一行的列。 例如:

id     name     code
---------------------
1      n1       
2      n2     
3      n3 

我有這個值數組 ['code-1','code-2','code3'] 我想設置為每一行,所以對於第一行代碼列的值將是 'code-1' 來自數組,第二行代碼列的值將是'code-2',第三行代碼列的值將是來自數組的'code-3'。 所以決賽桌將如下所示:

id     name     code
---------------------
1      n1       code-1
2      n2       code-2
3      n3       code-3

我怎樣才能在一個 sql 查詢中做到這一點?

你可以這樣做:

update table t
    set code = concat('code-', id)
    where id in (1, 2, 3);

如果代碼並沒有真正綁定到 id,你可以使用一個case

update table t
    set code = (case when id = 1 then 'code-1'
                     when id = 2 then 'code-2'
                     when id = 3 then 'code-3'
                end)
    where id in (1, 2, 3);

創建一個新表(臨時表)來保存具有這樣架構的數組

id       code
-------------
1       code-1
2       code-2
3       code-3

並使用此更新語句更新您的原始表

UPDATE original
SET code = temp.code
FROM original INNER JOIN temp
ON original.id = temp.id

你如何識別表格中的“第一行”? “第二排”呢?

要使用 UPDATE 語句,我首先要使用 SELECT 語句,該語句返回行以及要分配的新值。

您當前擁有的“數組”,如果將其轉換為表格將是最簡單的。 如果你不想定義一個表並加載它,我們可以使用內聯視圖,但語句的大小可能是一個限制。

如果我們運行這個查詢,例如:

  SELECT 1 AS rownum, 'code-1' AS code
  UNION ALL SELECT 2, 'code-2'
  UNION ALL SELECT 3, 'code-3'

我們返回結果集中的三行,我們可以像表格一樣引用它們。 使用額外的UNION ALL SELECT擴展它以添加額外的行。

為了從我們要更新的表中獲取相應的rownum值,我們返回主鍵(或唯一的非空鍵),並按照我們想要的順序返回這些值,因此第一行的 rownum 為 1,第二行的為rownum 為 2 等。例如:

  SELECT r.id
       , @rn := @rn + 1 AS rowumn
    FROM mytable r
   CROSS JOIN ( SELECT @rn := 0 ) i
   ORDER BY r.name, r.id

有了這兩個結果,我們就可以連接回我們要更新的表,返回我們要分配給該行的新代碼值,例如:

  SELECT t.id
       , t.name
       , t.code AS old_code
       , c.code AS new_code
       , o.rownum
    FROM ( SELECT 1 AS rownum, 'code-1' AS code
           UNION ALL SELECT 2, 'code-2'
           UNION ALL SELECT 3, 'code-3'
         ) c
    JOIN ( SELECT r.id
                , @rn := @rn + 1 AS rowumn
            FROM mytable r
            CROSS JOIN ( SELECT @rn := 0 ) i
            ORDER BY r.name, r.id
         ) o
      ON o.rownum = c.rownum
    JOIN mytable t
      ON t.id = o.id 

一旦我們納的回國,我們要更新的行,我們要分配給每個行的新值,我們可以轉換成一個UPDATE語句替換SELECT ... FROMUPDATE ,並加入SET的條款聲明的結尾。 (在之前WHERE子句,如果我們有一個WHERE子句。)

  UPDATE ( SELECT 1 AS rownum, 'code-1' AS code
           UNION ALL SELECT 2, 'code-2'
           UNION ALL SELECT 3, 'code-3'
         ) c
    JOIN ( SELECT r.id
                , @rn := @rn + 1 AS rowumn
            FROM mytable r
            CROSS JOIN ( SELECT @rn := 0 ) i
            ORDER BY r.name, r.id
         ) o
      ON o.rownum = c.rownum
    JOIN mytable t
      ON t.id = o.id 
     SET t.code = c.code

我就是這樣做的。

如果“新代碼”數組中的行數很大,我會創建一個表,並將數組值加載到表中。 然后用對表的引用替換內聯視圖查詢c

    FROM my_new_code_table c

或者,我可以將語句分解為可管理的塊。 做 20 個代碼,然后為下一組 20 行:

       ( SELECT 21 AS rownum, 'code-21' AS code 
         UNION ALL SELECT 22, 'code-22'
         ... 
         UNION ALL SELECT 40, 'code-40'
       ) c

我想出了一個不同的解決方案來解決我的問題,因為我有數千個條目需要使用連接來糾正:

UPDATE `entry`
JOIN 
( *DEFINE QUERY FOR LOOKUPTABLE HERE* ) as alias
on alias.id=entry.valuetoreplace
SET `valuetoreplace` = alias.newvalue;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM