Pentaho(勺子):为 SQL 中的许多行生成主键

Pentaho (spoon): generate primary key for many rows in SQL

我有一个案例:将数据从access数据库传输到SQL。我遇到了如何在 SQL.

中创建大量新主键的问题

之前转表的时候,我用Generator Random Values来生成Random String。新密钥我砍到5位数了

enter image description here

但是现在我有很多行 900 000 并且包含大约 200 个新键。

我无法使用添加序列,因为主键的长度为 5 个数字 (char(5))。

我想我可以使用 java 创建一个密钥并找到这个脚本,但我不知道它是如何工作的。

enter image description here

enter image description here

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];
    }

enter image description here

我的数据库没有sequence可以使用Add sequence和Use DB to get sequence,但是有生成key的功能。我该如何使用这个功能?还是不行?

这是丢失数据的统计。在这种情况下,我可以创建一个循环来重新生成密钥吗?

enter image description here

不是创建随机密钥,而是使用序列将序列转换为具有高基数的数字(例如 javascript id_as_char = id_as_int.toString(36))。

当然,你还有其他方法!

感谢您的帮助。我在 else 中添加了一行以在字符串前添加“0”。

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

00zzm 00zzn 00zzo 00zp 00zzq 00zr 00zs 00zz 00zzu 00zzv 00zw 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"

为什么不将序列处理留给 sql 服务器?你使用哪个数据库? 如果您使用 mysql 或 postgres,您可以创建一个序列类型的新列,并且这个序列唯一连续编号的创建将在数据库级别得到更好的处理。

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