Вставка уникальных случайных значений без каких-либо ограничений, определенных в PostgreSQL

#postgresql

#postgresql

Вопрос:

Я хочу сгенерировать уникальные случайные значения идентификаторов клиентов в первом цикле, поэтому он проверяет, является ли значение i меньше 0,2, он добавляет Null к этой строке, если значение i> 0,2, тогда он должен добавить уникальное случайное значение, которого ранее не должно было быть в этом столбце. Я не хочу использовать ограничение UNIQUE или PK для этого столбца, поскольку я хочу добавить к нему несколько нулевых значений, и это также не PK. Мне нужен эффективный способ. Это то, что я делал до сих пор, и мне не удалось достичь того, чего я хочу. Я новичок в PostgreSQL, поэтому, пожалуйста, помогите мне. Спасибо.

 CREATE OR REPLACE FUNCTION aa_dev.rand_cust(low INT ,high INT)
  RETURNS TABLE (Cust_id  int) AS
$
declare

i int := 0;
counter int := 0;
rand int := 0;
begin

    DROP TABLE IF EXISTS aa_dev.Customer;

    CREATE TABLE IF NOT EXISTS aa_dev.Customer (
    Cust_id INT
    );

    while counter <= high loop
        rand = floor(random()* (high-low   1)   low);
        i = random()* (1-0   1)   0;
        if i > 0.2 then
            Insert into aa_dev.Customer (Cust_id) values(rand);
            IF (EXISTS(SELECT rand_cust.Cust_id FROM aa_dev.Customer WHERE rand_cust.Cust_id = rand)) THEN
                UPDATE aa_dev.Customer SET rand_cust.Cust_id = floor(random()* (high-low  1)   low) WHERE rand_cust.Cust_id = rand;
            END IF;
            -- Insert into aa_dev.Customer (Cust_id) values(floor(random()* (high-low   1)   low))
        else
            Insert into aa_dev.Customer (Cust_id) values(Null);
        end if;
        counter := counter   1;
    end loop;

    return query
    select *
    from aa_dev.Customer;
end

$
LANGUAGE plpgsql;

select * from aa_dev.rand_cust(1, 50);
 

Комментарии:

1. Если вы хотите, чтобы ваши значения были уникальными, вам обязательно следует добавить UNIQUE ограничение для этого столбца. Для этого не требуется делать столбец первичным ключом или вводить принудительное NOT NULL ограничение — вы все равно NULL можете просто вставлять значения, которые игнорируются уникальным ограничением.

2. Я хочу, чтобы значения были уникальными для этого шага, но я хочу принудительно добавлять повторяющиеся значения на следующем шаге, добавив уникальное ограничение, я не смогу этого добиться. Есть ли какое-либо другое решение? @Bergi