簡體   English   中英

每行具有不同值的 UPDATE SET 列

[英]UPDATE SET column with different values per row

如果我有一個這樣的表my_table

| id | val1 | val2|
| 1  | foo1 | bar |
| 2  | foo2 | baz |
| 3  | foo3 | bam |

我有一個硬編碼的逗號分隔值列表,這些值是我以編程方式生成的: spam, eggs, ham

我想將我的值插入到列val1中。 我在想象這樣的事情:

UPDATE my_table SET val1 = SELECT * FROM (VALUES ('spam'),('eggs'),('ham'))

但這給了我一個語法錯誤(MySQL 5.6.44)

最終結果應如下所示:

| id | val1 | val2|
| 1  | spam | bar |
| 2  | eggs | baz |
| 3  | ham  | bam |
DROP TABLE IF EXISTS my_table;

CREATE TABLE my_table
(id SERIAL PRIMARY KEY
,val1 VARCHAR(12) NOT NULL
,val2 VARCHAR(12) NOT NULL
);

INSERT INTO my_table VALUES
(1,'foo1','bar'),
(2,'foo2','baz'),
(3,'foo3','bam');

UPDATE my_table SET val1 = SUBSTRING_INDEX(SUBSTRING_INDEX('spam,eggs,ham',',',id),',',-1);

SELECT * FROM my_table;
+----+------+------+
| id | val1 | val2 |
+----+------+------+
|  1 | spam | bar  |
|  2 | eggs | baz  |
|  3 | ham  | bam  |
+----+------+------+

@Strawberry回答確實堪稱典范; 但是如果id值不連續怎么辦。

例如, id值為2, 5, 6 在這種情況下,我們可以使用 MariaDB 10.2+ / MySQL 8+ 中的Row_Number()功能模擬連續的new_id 我還注意到您輸入的以逗號分隔的字符串在逗號后有空格。 為了處理這個問題(可變間距),我們可以在 substring 操作之后使用Trim() function。 基於@Strawberry的出色回答

Schema (MySQL v8.0) -在 DB Fiddle 上查看

CREATE TABLE your_table_name
(id INT UNSIGNED PRIMARY KEY
,val1 VARCHAR(12) NOT NULL
,val2 VARCHAR(12) NOT NULL
);

INSERT INTO your_table_name VALUES
(2,'foo1','bar'),
(5,'foo2','baz'),
(6,'foo3','bam');

更新查詢

UPDATE your_table_name t1
       JOIN (SELECT Row_number()
                      OVER (
                        ORDER BY id) AS new_id,
                    id
             FROM   your_table_name) t2
         ON t2.id = t1.id
SET    val1 =
Trim(Substring_index(Substring_index('spam, eggs,  ham', ',', t2.new_id), ',', -1));

檢查數據

SELECT * FROM your_table_name;

| id  | val1 | val2 |
| --- | ---- | ---- |
| 2   | spam | bar  |
| 5   | eggs | baz  |
| 6   | ham  | bam  |

---

在舊版本的 MySQL/MariaDB 中,window 函數不可用。 在這種情況下,我們可以利用用戶定義的變量來模擬new_id

Schema (MySQL v5.7) -在 DB Fiddle 上查看

CREATE TABLE your_table_name
(id INT UNSIGNED PRIMARY KEY
,val1 VARCHAR(12) NOT NULL
,val2 VARCHAR(12) NOT NULL
);

INSERT INTO your_table_name VALUES
(2,'foo1','bar'),
(5,'foo2','baz'),
(6,'foo3','bam');

更新查詢

UPDATE your_table_name t1
       JOIN (SELECT @rn := @rn + 1 AS new_id, 
                    id 
             FROM   your_table_name 
             CROSS JOIN (SELECT @rn := 0) vars
             ORDER BY id) t2
         ON t2.id = t1.id
SET    val1 =
Trim(Substring_index(Substring_index('spam, eggs,  ham', ',', t2.new_id), ',', -1));

檢查數據

SELECT * FROM your_table_name;

| id  | val1 | val2 |
| --- | ---- | ---- |
| 2   | spam | bar  |
| 5   | eggs | baz  |
| 6   | ham  | bam  |

暫無
暫無

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

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