Tạo số ngẫu nhiên duy nhất trong mysql

Trong dự án của tôi, tôi cần tạo ra rất nhiều [hàng nghìn] số ngẫu nhiên duy nhất. Cho đến nay tôi đang sử dụng giải pháp không hiệu quả này

public void codeFactory[int count] {
    for [;count > 0; count --] {
        while [true] {
            long code = getRandomCode[];
            Long codeStored = em.select["c.code"].from["codes c"].where["c.code = ?", code]
                .fetchSingle[Long.class];
            if [codeStored == null] {
                // this code has not yet been stored
                break;
            } else {
                // we continue, this code is already stored
                continue;
            }
            ...
        }
        // we have created a unique code
    }
}

Có cách nào để tạo chúng trực tiếp với MySQL để tôi không cần truy cập MySQL cho mỗi mã không?

CHỈNH SỬA. Tôi muốn tạo các số NGẪU NHIÊN trong khoảng từ 1000000000000 đến 9999999999999

- stackoverflow. com

ghi bàn. 4

câu trả lời được chấp nhận

chúng ta hãy xem xét

  1. Tên bảng của bạn là
    SELECT FLOOR[RAND[] * [ -  + 1]] +  AS random_number
    FROM TestTable 
    WHERE "random_num" NOT IN [SELECT TestColumn FROM TestTable] LIMIT 1
    
    4
  2. Bạn phải tạo một số ngẫu nhiên giữa hai số
    SELECT FLOOR[RAND[] * [ -  + 1]] +  AS random_number
    FROM TestTable 
    WHERE "random_num" NOT IN [SELECT TestColumn FROM TestTable] LIMIT 1
    
    5 và
    SELECT FLOOR[RAND[] * [ -  + 1]] +  AS random_number
    FROM TestTable 
    WHERE "random_num" NOT IN [SELECT TestColumn FROM TestTable] LIMIT 1
    
    6
  3. Số ngẫu nhiên phải là duy nhất và sẽ được lưu trữ trong cột
    SELECT FLOOR[RAND[] * [ -  + 1]] +  AS random_number
    FROM TestTable 
    WHERE "random_num" NOT IN [SELECT TestColumn FROM TestTable] LIMIT 1
    
    7

bạn có thể làm một cái gì đó như thế này

SELECT FLOOR[RAND[] * [ -  + 1]] +  AS random_number
FROM TestTable 
WHERE "random_num" NOT IN [SELECT TestColumn FROM TestTable] LIMIT 1

Đọc thêm

ghi bàn. 0

Tại sao phải phát minh lại bánh xe? . Nhìn vào apache. của chung. toán3 chẳng hạn

package com.techtrip.labs.stackoverflow;

import org.apache.commons.math3.random.ISAACRandom;

public class GeneralTest {
    public static void main[String[] args] {        
        int[] seed = {19399213, 123219, 32132, 32838};
        ISAACRandom rndGen = new ISAACRandom[seed];
        for [int i = 0; i < 1000; i++]{
            System.out.println[String.format["The random value is %d", rndGen.nextLong[]]];
        }
    }
}

ghi bàn. 0

Bạn cũng có thể làm điều đó một cách tổng quát bằng cách sử dụng JPA và trình tạo trình tự nếu mục tiêu của bạn là tạo các id duy nhất;

Bạn có thể sử dụng LPAD[] cùng với rand[] và floor[] để tạo số ngẫu nhiên gồm 6 chữ số. Trước tiên chúng ta hãy tạo một bảng -

mysql> create table DemoTable
   [
   Value int
   ];
Query OK, 0 rows affected [0.64 sec]

Chèn bản ghi vào bảng bằng lệnh chèn -

mysql> insert into DemoTable values[1];
Query OK, 1 row affected [0.16 sec]
mysql> insert into DemoTable values[2];
Query OK, 1 row affected [0.17 sec]
mysql> insert into DemoTable values[3];
Query OK, 1 row affected [0.24 sec]
mysql> insert into DemoTable values[4];
Query OK, 1 row affected [0.12 sec]
mysql> insert into DemoTable values[5];
Query OK, 1 row affected [0.15 sec]
mysql> insert into DemoTable values[6];
Query OK, 1 row affected [0.19 sec]

Hiển thị tất cả các bản ghi từ bảng bằng câu lệnh select -

mysql> select * from DemoTable;

Điều này sẽ tạo ra đầu ra sau -

+-------+
| Value |
+-------+
| 1     |
| 2     |
| 3     |
| 4     |
| 5     |
| 6     |
+-------+
6 rows in set [0.00 sec]

Sau đây là truy vấn để tạo số ngẫu nhiên gồm 6 chữ số trong MySQL -

mysql> update DemoTable
set Value=LPAD[FLOOR[RAND[] * 999999.99], 6, '0'];
Query OK, 6 rows affected [0.15 sec]
Rows matched: 6 Changed: 6 Warnings: 0

Hãy để chúng tôi hiển thị các bản ghi được cập nhật từ bảng -

mysql> select * from DemoTable;

Điều này sẽ tạo ra đầu ra sau -

+--------+
| Value  |
+--------+
| 499540 |
| 550607 |
| 254419 |
| 620272 |
| 338104 |
| 829705 |
+--------+
6 rows in set [0.00 sec]

Mặc dù bạn có thể không mong đợi, nhưng các số ngẫu nhiên được sử dụng khá thường xuyên trong cơ sở dữ liệu, đặc biệt là khi tạo dữ liệu giả, cung cấp danh sách sản phẩm ngẫu nhiên, chỉ nêu tên một số

Chẳng hạn, giả sử bạn có một bảng tên là “productData” và bên trong bảng này có một trường tên là “randCol”. Sau đó, nếu bạn muốn cập nhật từng hàng và đặt một giá trị trong phạm vi 1-100 trong “randCol”, bạn có thể làm điều gì đó như thế này

SELECT FLOOR[RAND[] * [ -  + 1]] +  AS random_number
FROM TestTable 
WHERE "random_num" NOT IN [SELECT TestColumn FROM TestTable] LIMIT 1
0

Đợi đã. Tại sao không chỉ đơn giản là sử dụng FLOOR[ RAND[ ] *100 ]? . 0, vì vậy nó sẽ không bao giờ trả về 1, loại bỏ phần cao nhất của phạm vi. RAND đôi khi cũng sẽ trả về 0, do đó sẽ trả về số 0 trong phép tính sản phẩm, một giá trị không hợp lệ trong phạm vi mong muốn của chúng tôi

Với ý nghĩ đó, giá trị lớn nhất có thể được tạo bởi RAND[] * 100 sẽ là 99. 999999, mà khi làm nổi sẽ cho 99. Ở phía bên kia của phạm vi, giá trị nhỏ nhất sẽ xảy ra khi RAND[] trả về 0. Khi thêm 1 vào các giá trị này, chúng tôi có cả hai đầu của phạm vi được bao phủ và không có số nào bên ngoài nó sẽ được tạo

Tạo các số ngẫu nhiên ĐỘC ĐÁO trong một bảng

Truy vấn trước hữu ích khi bạn muốn điền vào một cột bằng các số ngẫu nhiên trong một phạm vi. Nhưng truy vấn này không đảm bảo các giá trị duy nhất cho mỗi hàng, ngay cả với phạm vi rất lớn. Vì vậy, nếu chúng ta muốn các giá trị duy nhất trong mỗi hàng trong khi tính ngẫu nhiên, chúng ta có thể tìm một thứ như thế này

SELECT FLOOR[RAND[] * [ -  + 1]] +  AS random_number
FROM TestTable 
WHERE "random_num" NOT IN [SELECT TestColumn FROM TestTable] LIMIT 1
1

Đây là cách nó hoạt động. Trước tiên, chúng tôi đặt biến do người dùng xác định @rnd thành 0, sau đó chúng tôi cập nhật tất cả các hàng trong khi sắp xếp bằng cách sử dụng RAND[] làm biến sắp xếp. Vì vậy, đối với mỗi hàng được cập nhật, chúng tôi gán cho nó giá trị [@rnd + 1] trong khi lưu trữ giá trị này trong cùng một biến. Bằng cách này, hàng tiếp theo sẽ nhận giá trị này + 1 và vì chúng tôi đang sắp xếp ngẫu nhiên, mỗi hàng sẽ có một giá trị ngẫu nhiên VÀ duy nhất. Tập hợp số sẽ là tuần tự nhưng mỗi hàng có một số ngẫu nhiên trong tập hợp đó, không trùng lặp

Một số thận trọng. Vì truy vấn này sử dụng Biến do người dùng xác định [@rnd] và các biến này là kết nối cụ thể, bạn KHÔNG thể sử dụng truy vấn MySQL này với hệ thống sử dụng kết nối tổng hợp hoặc kết nối liên tục. Sử dụng chúng trên các môi trường này sẽ trả về kết quả sai, vì các kết nối sẽ vượt qua giá trị của @rnd, làm rối kết quả

Truy xuất các hàng theo thứ tự ngẫu nhiên

Đôi khi, rất hữu ích khi lấy danh sách dữ liệu từ cơ sở dữ liệu [e. g. ưu đãi] và trình bày nó cho người dùng ở giao diện người dùng. Tuy nhiên, việc hiển thị cùng một danh sách mỗi lần có thể khiến người dùng cảm thấy nhàm chán và buộc họ phải thoát khỏi trang web của bạn, làm mất khách hàng tiềm năng/khách hàng tiềm năng

Trong những trường hợp này, hiển thị danh sách ưu đãi ngẫu nhiên có thể là lựa chọn tốt hơn, vì mỗi lần người dùng truy cập trang web, sẽ có những ưu đãi khác nhau, do đó tăng khả năng chuyển đổi

Đạt được điều này khá đơn giản, vì các ưu đãi có thể được sắp xếp bằng cách sử dụng truy vấn như thế này

SELECT FLOOR[RAND[] * [ -  + 1]] +  AS random_number
FROM TestTable 
WHERE "random_num" NOT IN [SELECT TestColumn FROM TestTable] LIMIT 1
2

Dễ nhỉ? . Tuy nhiên, ở đây có “mặt tối” của việc sử dụng giải pháp này. MySQL sẽ tạo một bảng tạm thời với tất cả các kết quả, sau đó sẽ được gán một chỉ mục ngẫu nhiên cho mỗi hàng và cuối cùng sẽ trả về các hàng ngẫu nhiên. Ngoài ra, việc tạo các số ngẫu nhiên gây ra gánh nặng lớn cho máy chủ vì chúng được tạo bằng các phép tính toán phức tạp. Vì vậy, giải pháp này không phải là ý kiến ​​hay nếu bạn đang xử lý một bảng có nhiều hàng

Xử lý phân trang

Từ ví dụ trên, chúng ta thấy rằng việc sắp xếp các hàng theo thứ tự ngẫu nhiên rất dễ dàng [mặc dù, như đã đề cập trước đó, có thể khá chậm nếu quản lý một số lượng lớn hàng]. Tuy nhiên, sử dụng truy vấn này trong ngữ cảnh phân trang, trong đó chúng tôi trả về một đoạn X hàng từ bảng trên mỗi truy vấn và sau đó nhận các đoạn khác trong các truy vấn liên tiếp. như vậy

SELECT FLOOR[RAND[] * [ -  + 1]] +  AS random_number
FROM TestTable 
WHERE "random_num" NOT IN [SELECT TestColumn FROM TestTable] LIMIT 1
3

Tại sao?

Vì vậy, làm thế nào để chúng ta giải quyết điều này? . Giá trị này được sử dụng để thiết lập công cụ ngẫu nhiên hóa. Nếu không có hạt giống nào được cung cấp, thì một hạt giống được tạo bởi MySQL “dưới mui xe”, vì vậy mỗi khi hàm được gọi, các giá trị hạt giống khác nhau sẽ được cung cấp

Một hàm ý của việc sử dụng giá trị gốc cố định là đối với các giá trị đối số bằng nhau, RAND[] tạo ra một chuỗi các giá trị cột có thể lặp lại. Điều này có nghĩa là mỗi lần chạy truy vấn, các hàng sẽ được sắp xếp theo cùng một thứ tự, bất kể chúng ta gọi nó bao nhiêu lần. Vì vậy, bây giờ chúng tôi có thể truy xuất từng "khối" hàng, được sắp xếp ngẫu nhiên mà không sợ bị lặp hoặc thiếu hàng

Nhưng làm thế nào để chúng tôi cung cấp một danh sách ngẫu nhiên? . Một tùy chọn là truy xuất một giá trị ngẫu nhiên từ chính MySQL và sau đó sử dụng nó cho mỗi cuộc gọi. Một cách khác là sử dụng công cụ ngẫu nhiên hóa từ ngôn ngữ bạn đang viết mã. Ví dụ: nếu đang sử dụng PHP, bạn có thể sử dụng rand[] hoặc mt_rand[] để tạo giá trị gốc và sử dụng giá trị đó trong các truy vấn MySQL  [Lưu ý. kể từ PHP 7. 1. 0 đều sử dụng cùng một động cơ, bộ tạo Mersenne Twister, vì vậy việc sử dụng cái này hay cái kia đều giống nhau]

Bằng cách này, mỗi lần chúng tôi yêu cầu một “trang” và chuyển cùng một giá trị gốc, chúng tôi có thể chắc chắn rằng không có hàng nào bị bỏ sót và không có hàng trùng lặp nào xuất hiện

Làm cách nào chúng tôi có thể nhận được một số ngẫu nhiên trong khoảng từ 1 đến 100 trong MySQL?

Để lấy giá trị ngẫu nhiên giữa hai giá trị, sử dụng phương thức rand[] của MySQL với floor[] . Cú pháp như sau. chọn SÀN[ RAND[] * [giá trị tối đa-giá trị tối thiểu] + giá trị tối thiểu] làm anyVariableName; .

Làm cách nào để tạo số ngẫu nhiên mà không lặp lại trong cơ sở dữ liệu bằng MySQL?

Chạy truy vấn để tìm số lượng "không được chọn" và sau đó tìm một số ngẫu nhiên trong khoảng từ 0 đến số "không được chọn". Sau đó chạy truy vấn SQL để lấy số ở vị trí đó [nơi không được chọn, sử dụng GIỚI HẠN trong mysql] và đánh dấu là đã chọn

Làm thế nào để sử dụng rand[] trong MySQL?

Trả về một giá trị dấu phẩy động ngẫu nhiên v trong phạm vi 0

Chủ Đề