【发布时间】:2019-03-14 13:19:18
【问题描述】:
我想更新列user,用id 替换最后6 个字符并用零填充。 user 列下的所有键的格式为 ^[A-Z]{2}[0-9]{8}$。例如,这里有一些示例数据:
MariaDB [test]> SELECT * FROM users ORDER BY id ASC LIMIT 3;
+----+------------+
| id | user |
+----+------------+
| 1 | AS12491264 |
| 2 | LQ10240183 |
| 3 | MR12037108 |
+----+------------+
3 rows in set (0.00 sec)
预期结果是:
+----+------------+
| id | user |
+----+------------+
| 1 | AS12000001 |
| 2 | LQ10000002 |
| 3 | MR12000003 |
+----+------------+
我解决了以下两个查询,但都失败了:
UPDATE users AS u
SET u.user = (
SELECT
CONCAT(
SUBSTRING(s.user, 0, 4),
LPAD(s.id, 6, '0')
)
FROM users AS s
WHERE s.id = u.id
);
UPDATE users AS u
INNER JOIN (
SELECT
s.id AS id,
CONCAT(
SUBSTRING(s.user, 0, 4),
LPAD(s.id, 6, '0')
) AS data
FROM users AS s
) AS s ON s.id = u.id
SET u.user = s.data;
都失败并给出这个结果:
+----+--------+
| id | user |
+----+--------+
| 1 | 000001 |
| 2 | 000002 |
| 3 | 000003 |
+----+--------+
这是数据库架构(取自 mysqldump):
CREATE TABLE `users` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user` varchar(64) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `user` (`user`)
) ENGINE=InnoDB AUTO_INCREMENT=8964 DEFAULT CHARSET=utf8;
我在 MariaDB 10.1.38 上运行。
【问题讨论】:
-
你真的把那个查询复杂化了
-
我强烈建议在
SELECT语句中测试表达式,然后再将它们合并到UPDATE中。 -
@spencer7593 顾名思义,它实际上是一个测试数据库。我有原始的
mysqldump可以在一个 shell 命令中恢复所有更改。 -
测试数据库没关系。我的建议是一样的。表达式可以在
SELECT语句中进行测试,这允许我们返回当前值以及新值,当我们寻求帮助时,这可以作为向同事演示的有用。 -
SUBSTRING()从 1 开始,而不是 0。但请参阅 Nick 的回答。
标签: mysql sql-update mariadb inner-join