#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