[英]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 ... FROM
與UPDATE
,並加入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.