【问题标题】:Generate Random & Unique Number and Insert into Database生成随机和唯一数字并插入数据库
【发布时间】:2013-12-31 16:10:42
【问题描述】:

我的目标是生成随机数并插入数据库。我不想要任何重复。我已经完成了我的研究,其中之一是先检查数据库,然后插入。

//GENEREATE RANDOM NUMBER
long number = (long) Math.floor(Math.random() * 900000L) + 900000L;


//CHECK IF NUMBER IS ALREADY EXIST IN DATABASE
String searchQuery = "select appleId from food where appleId='" + number + "'";
         try {
             Statement stmt = connection.createStatement();
             ResultSet rs = stmt.executeQuery(searchQuery);
             boolean appleIdExists = rs.next();

//IT IS UNIQUE  

if (!appleIdExists) {

            try {
                //INSERT STATEMENT
                       .......
            } catch (SQLException e) {
                e.printStackTrace();
            }
                }

//IT IS NOT UNIQUE..
                else
                {
                       .....

                }

                }catch (Exception ex) {
                    System.out
                    .println("Log In failed: An Exception has occurred! "
                            + ex);
        }

所以我的问题是如果它不是唯一的,我需要生成另一个数字并再次检查吗?并一次又一次地检查,直到它是唯一的?结果会不会是很多 if-else 语句?

我不确定使用 if-else 语句是否是有效的方法。还是有别的办法?

有什么建议吗?

帮助将不胜感激! :)

【问题讨论】:

  • 使用循环而不是 if/else。
  • 这是唯一插入表格的东西吗?如果没有,这无论如何都不够好,因为在您的支票和插入之间可能会插入数字。相反,在表上添加一个约束,try 执行插入,并捕获任何引发的约束冲突异常并重试。此外,您应该使用参数化 SQL 而不是字符串连接。还要考虑使用数据库本身为此提供的任何工具 - 如果您真的只想要一个唯一的 ID,有很多方法可以解决这个问题。随机性有多重要?
  • 必须是数字吗?可以改为 GUID 吗? docs.oracle.com/javase/6/docs/api/java/util/UUID.html
  • @JonSkeet 这不是唯一的......还有更多,但我从不包括在这里。
  • @Taylor 是 5 位数字。

标签: java random unique sql-insert


【解决方案1】:

为什么不在数据库中使用自动递增的标识列,实质上是让数据库为您创建一个唯一的 id?每个现代 DBMS 都支持此功能。

对于MySQL

CREATE TABLE animals (
     id MEDIUMINT NOT NULL AUTO_INCREMENT,
     name CHAR(30) NOT NULL,
     PRIMARY KEY (id)
)

对于 PostgreSQL:

CREATE TABLE animals
(
    id             serial primary key,
    name        VARCHAR(40) not null
);

所有数据库都有这个能力,当你使用 JDBC 插入一行时,你会在响应中取回插入行的键。一个简化的例子:

String query = "INSERT INTO animals (name) VALUES ('zebra')";
Integer insertedId = stmt.executeUpdate(query, Statement.RETURN_GENERATED_KEYS);

【讨论】:

  • 问题是,有时您希望这个随机数不可预测。使用自动增量,很容易知道哪些数字已经分配。
【解决方案2】:

如果你只想生成随机数并插入数据库,那么你可以使用Fisher Yates shuffle algorithm

查看此问题了解详情:Unique (non-repeating) random numbers in O(1)?

【讨论】:

    【解决方案3】:
    1. 您可以将随机数(生成的/现有的)保存到集合/或缓存或队列中。不需要每次都在数据库中检查。 尝试批量执行操作。要么首先生成所有唯一的随机数,然后根据您的要求持久化。

    2. 在列上定义一个唯一 ID - 不需要执行选择和插入,只需执行 INSERT 以防失败重复相同的过程。

    3. 您可以使用递归,因为我们不知道失败的次数。

    theexamtime.com

    【讨论】:

      猜你喜欢
      • 2020-08-30
      • 1970-01-01
      • 2018-05-03
      • 1970-01-01
      • 1970-01-01
      • 2019-06-10
      • 2011-06-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多