SQL - можно ли заменить значение в первичном ключе на uuid? - PullRequest
0 голосов
/ 06 июня 2018

У меня есть тестовая таблица, содержащая поле идентификатора (первичный ключ) со значениями вроде (abcd1234, mnop5678).Теперь я хочу заменить все значения ID, чтобы ввести дефисы, чтобы значение стало (abcd-1234, mnop-5678).Как мне сделать это с помощью SQL)?

PS: реальный случай использования - это то, что поле идентификатора раньше было буквенно-цифровым значением и теперь изменено на формат uuid (с несколькими дефисами вФормат 8-4-4-4-12) Задача - преобразовать существующие данные, чтобы избежать усечения и перезагрузки данных, поскольку они содержат миллионы строк.Извините за любые опечатки, набрав с помощью мобильного телефона.

Ответы [ 2 ]

0 голосов
/ 06 июня 2018

Эскиз с использованием некоторого псевдо-диалекта SQL, поскольку вы не пометили свою СУБД:

  1. Сначала необходимо создать новый столбец в таблице с типом UUID.

    ALTER TABLE t
          ADD (new_id uuid);
    
  2. Затем заполните его GUID.

    UPDATE t
           SET new_id = new_uuid();
    
  3. Затем измените все таблицы, которые также ссылаются на таблицу.

    ALTER u
          ADD (new_t uuid);
    ...
    
  4. Также обновите их.

    UPDATE u
           SET new_t = (SELECT t.new_id
                               FROM t
                               WHERE t.id = u.t);
    
  5. Удалите старый столбец в ссылочных таблицах.

    ALTER TABLE u
                DROP t;
    ...
    
  6. Опустить столбец в таблице.

    ALTER TABLE t
                DROP id;
    
  7. Переименовать столбец в таблице.

    ALTER TABLE t
                RENAME new_id TO id;
    
  8. Переименовать столбецв ссылочных таблицах.

    ALTER TABLE u
                RENAME new_t TO t;
    ...
    
  9. Повторно введите ограничения для таблицы.

    ALTER TABLE t
                ADD (PRIMARY KEY (id));
    
  10. Повторно введите ограничения для ссылочных таблиц.

    ALTER TABLE u
                ADD (FOREIGN KEY (t)
                                 REFERENCES t
                                            (id));
    

Вам также может понадобиться переиндексировать столбцы в зависимости от индексов, которые у вас были для старых столбцов.

0 голосов
/ 06 июня 2018

Решение MYSQL:
Предположим, у нас есть таблица test1, в которой первичный ключ имеет тип varchar, см. Ниже структуру таблицы.

CREATE TABLE `test1` (
 `id` varchar(20) NOT NULL COMMENT 'Primary Key',
 `name` varchar(255) DEFAULT NULL COMMENT 'Name',
 PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1  

Вставка записей примера:

INSERT INTO `test1` (`id`, `name`) VALUES ('abcd1234', 'abcd');
INSERT INTO `test1` (`id`, `name`) VALUES ('mnop5678', 'mnop');

Теперь выполняем запрос на обновление, где мы рассматриваем формат поля идентификатора: сначала 4 символа - буква, 5 - - (дефис) и затем после цифр.

UPDATE `test1` SET `id` = CONCAT(SUBSTRING(`id`, 1, 4), '-', SUBSTRING(`id`, 5)) WHERE 1;

Исключили здесь условие where, поскольку необходимо выполнить операцию обновления для полной таблицы.

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