MySQL Обновите столбец со значениями, объединенными из целевого столбца и другого столбца - PullRequest
1 голос
/ 14 марта 2019

Я хочу обновить столбец user с последними 6 символами, замененными на id с добавлением нуля.Все ключи в столбце 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.

1 Ответ

3 голосов
/ 14 марта 2019

Это должно делать то, что вы хотите:

UPDATE users
SET user = CONCAT(LEFT(user,4), LPAD(id, 6, '0'))

Выход:

id  user
1   AS12000001
2   LQ10000002
3   MR12000003

Демонстрация на dbfiddle

Обновление

Если пользовательский столбец имеет переменную длину, вы можете заменить только последние 6 символов, используя этот запрос, который использует CHAR_LENGTH для определения длины строки и вычитает 6 из этого, чтобы определить, сколько символов слева для держать. Мы используем CHAR_LENGTH вместо LENGTH, поэтому запрос по-прежнему работает для многобайтовых кодировок символов.

UPDATE users
SET user = CONCAT(LEFT(user,CHAR_LENGTH(user)-6), LPAD(id, 6, '0'))

Демонстрация на dbfiddle

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...