如果我有这样一个表my_table:
| id | val1 | val2|
| 1 | foo1 | bar |
| 2 | foo2 | baz |
| 3 | foo3 | bam |
Run Code Online (Sandbox Code Playgroud)
我有,我已经程序生成值的硬编码的逗号分隔的列表: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 |
Run Code Online (Sandbox Code Playgroud)
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 |
+----+------+------+
Run Code Online (Sandbox Code Playgroud)
@Strawberry的回答确实是模范。但是如果id值不连续该怎么办。
例如,id值是2, 5, 6。在这种情况下,我们可以在MariaDB 10.2 + / MySQL 8+中模拟连续new_id使用Row_Number()功能。我还注意到,您输入的逗号分隔字符串在逗号后有空格。为了处理这个问题(可变的间距),我们可以Trim()在子字符串操作之后使用function。对构建的出色答卷@Strawberry:
模式(MySQL v8.0)- 在数据库小提琴上查看
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');
Run Code Online (Sandbox Code Playgroud)
更新查询
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));
Run Code Online (Sandbox Code Playgroud)
检查数据
SELECT * FROM your_table_name;
| id | val1 | val2 |
| --- | ---- | ---- |
| 2 | spam | bar |
| 5 | eggs | baz |
| 6 | ham | bam |
Run Code Online (Sandbox Code Playgroud)
在旧版本的MySQL / MariaDB中,窗口功能不可用。在这种情况下,我们可以利用用户定义的变量进行仿真new_id:
模式(MySQL v5.7)- 在数据库小提琴上查看
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');
Run Code Online (Sandbox Code Playgroud)
更新查询
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));
Run Code Online (Sandbox Code Playgroud)
检查数据
SELECT * FROM your_table_name;
| id | val1 | val2 |
| --- | ---- | ---- |
| 2 | spam | bar |
| 5 | eggs | baz |
| 6 | ham | bam |
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
132 次 |
| 最近记录: |