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
我有一个案例:将数据从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