Пентахо (ложка): сгенерировать первичный ключ для многих строк в SQL

У меня случай: перенести данные из базы данных доступа в SQL. Я столкнулся с проблемой создания множества новых первичных ключей в SQL.

Когда я переносил предыдущие таблицы, я использовал генератор случайных значений для генерации случайной строки. Новый ключ я сократил до 5 цифр.

введите здесь описание изображения

Но сейчас у меня много рядов 900 000 и насчитывается около 200 новых ключей.

Я не мог использовать Добавить последовательность, потому что первичный ключ имеет длину 5 цифр (char (5)).

Я думаю, что могу использовать java для создания ключа и найти этот скрипт, но я не понимаю, как это работает.

введите здесь описание изображения

введите здесь описание изображения

import java.security.SecureRandom;
import java.util.Locale;
import java.util.Objects;
import java.util.Random;
public class RandomString {
    public String nextString() {
        for (int idx = 0; idx < buf.length; ++idx)
            buf[idx] = symbols[random.nextInt(symbols.length)];
        return new String(buf);
    }
    public static final String upper = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    public static final String lower = upper.toLowerCase(Locale.ROOT);
    public static final String digits = "0123456789";
    public static final String alphanum = upper + lower + digits;
    private final Random random;
    private final char[] symbols;
    private final char[] buf;
    public RandomString(int length, Random random, String symbols) {
        if (length < 1) throw new IllegalArgumentException();
        if (symbols.length() < 2) throw new IllegalArgumentException();
        this.random = Objects.requireNonNull(random);
        this.symbols = symbols.toCharArray();
        this.buf = new char[length];
    }

введите здесь описание изображения

В моей базе данных нет последовательности для использования Добавить последовательность и Использовать БД для получения последовательности, но есть функция для генерации ключей. Как я могу использовать эту функцию? Или нет?

Это статистика потерянных данных. Могу ли я создать цикл для повторной генерации ключа в такой ситуации?

введите здесь описание изображения


person Olesya    schedule 18.06.2018    source источник


Ответы (3)


Вместо создания случайных ключей используйте последовательность, чтобы преобразовать последовательность в число с большим основанием (например, с javascript id_as_char = id_as_int.toString(36)).

Конечно, есть и другие способы!

введите описание изображения здесь

person AlainD    schedule 18.06.2018

Спасибо за помощь. Я добавил еще одну строку, чтобы добавить «0» перед строкой.

id = id.toString(36)
while (id.length < (5 || 2)) {id = "0" + id;}

00zzm 00zzn 00zzo 00zzp 00zzq 00zzr 00zzs 00zzt 00zzu 00zzv 00zzw 00zzx 00zzy 00zzz 01000 01001 01002 01003 01004 01005 01006 01007 01008 01009 0100a 0100b

Это похоже на https://gist.github.com/endel/321925f6cafa25bbfbde.

Number.prototype.pad = function(size) {
  var s = String(this);
  while (s.length < (size || 2)) {s = "0" + s;}
  return s;
}

(1).pad(3) // => "001"
(10).pad(3) // => "010"
(100).pad(3) // => "100"
person Olesya    schedule 19.06.2018

почему бы вам не передать обработку последовательности серверу sql? какую базу данных вы используете? если вы используете mysql или postgres, вы можете создать новый столбец с серийным типом, и создание этого серийного уникального последовательного номера будет обрабатываться намного лучше на уровне базы данных.

https://www.postgresql.org/docs/9.5/static/datatype-numeric.html#DATATYPE-SERIAL

person jacktrade    schedule 20.06.2018
comment
Я использую MS SQL и не могу создавать новые столбцы, потому что у меня есть конкретная база данных. Я не создаю базу данных, я пытаюсь ее заполнить. - person Olesya; 21.06.2018
comment
В этом случае я рекомендую создавать uuid в качестве первичных ключей, уменьшая количество возможных коллизий между уникальными ключами. Используйте шаг Generate random value и выберите UUID4 - person jacktrade; 21.06.2018