【问题标题】:How to insert database from java a random unique integer?如何从java中插入一个随机唯一整数的数据库?
【发布时间】:2016-06-24 07:06:10
【问题描述】:

我想创建一个优先级编号,其中一个帐户将随机分配一个唯一编号。我目前仍在学习java和mysql,请原谅任何错误,希望你能帮助我解决这个问题。谢谢!

    public void add() {
    try {

        Class.forName("com.mysql.jdbc.Driver");  // MySQL database connection
        Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/system?" + "user=root&password=");
        PreparedStatement pstmt = null;

        pstmt = conn.prepareStatement("insert into customer values (?,?,?,?,?,?,?)");

        //customer_id
        pstmt.setInt(1, 0);
        //customer_name
        pstmt.setString(2, tf_name.getText());
        //customer_address
        pstmt.setString(3, tf_address.getText());
        //customer_contactqw
        pstmt.setString(4, tf_contact.getText());
        //customer_email
        pstmt.setString(5, tf_email.getText());
        //order_priority
        pstmt.setInt(6, 1000 + RAND() * 89999); // <-- pls help me here
        //customer_date            
        pstmt.setDate(7, convertUtilDateToSqlDate(dateChooser.getDate()));

        //execute the query
        pstmt.executeUpdate();

        //      JOptionPane.showMessageDialog(null, "Successfully added a new record!");
    } catch (Exception e) {
        JOptionPane.showMessageDialog(null, e);

    }

}

【问题讨论】:

  • 您忘记描述问题了。此代码以何种方式无法按预期工作?它是如何失败的?
  • 您是否有任何特殊原因不想告诉我们错误是什么?试着理解我们无法从这里看到您的屏幕。
  • @David pstmt.setInt(6, 1000 + RAND() * 89999); 我这里出错了。
  • 那么显然你应该更正那个错误。不管那个错误可能是什么。同样,出于某种原因,您拒绝向我们展示。
  • 为什么不在数据库中做呢? FLOOR(RAND() * 2147483648).

标签: java mysql sql


【解决方案1】:

How do I create a unique ID in Java?

您可以创建一个 UUID:

 pstmt.setInt(6, UUID.randomUUID().toString());

编辑:没有简单的方法来创建一个没有冲突的整数唯一 ID,因为只有 2^32 个选项,这可能会导致冲突。 您可以创建一个数组来保存到目前为止所有随机生成的数字。

如果你想冒碰撞的风险,你可以试试:

SecureRandom random = new SecureRandom();
pstmt.setInt(6, random.nextInt(Integer.MAX_VALUE));

如果您想跟踪到目前为止输入的所有 id 以防止发生冲突,您可以将它们存储在一个数组中。 假设你有ArrayList&lt;int&gt; arr;

SecureRandom random = new SecureRandom();
boolean inserted;
do{
    inserted = true;
    int id = random.nextInt(MAX_VALUE);
    for (int i=0; i<arr.size();i++){
        if (arr.get(i) == id)
            inserted = false;
    }
    if (!inserted){
        arr.add(id);
        pstmt.setInt(6,id);
    }
}while(!inserted);

【讨论】:

  • 我收到一条错误消息,提示 UUID 无法转换为 int。
【解决方案2】:

假设你在你的RAND() 方法中使用Math.random()(或类似方法),它总是返回一个double。 PreparedStatement 的 setInt 方法需要一个 int 参数,而乘法的结果是 double,这就是错误的原因。

您可以将setInt(.. 更改为setDouble(..,它会正常工作。

【讨论】:

  • 把它改成双倍但是得到一个错误,它找不到 RAND() 方法
  • 试试1000 + Math.random() * 89999。但它不会 100% 保证您的唯一性。
猜你喜欢
  • 1970-01-01
  • 2015-08-15
  • 1970-01-01
  • 1970-01-01
  • 2016-11-12
  • 1970-01-01
  • 2013-11-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多