Бывает, что в суете бегущих дней никто не реализовал простую, вроде бы, штуку, и нет ответа на твой вопрос ни в StackOverflow, ни в гугле... :)
Понадобилось намедни нагенерить в постгресе некоторое количество неповторяющихся случайных mac-адресов с первым октетом из нулей.
Настоящий веб-программист :))) написал бы аж целый скрипт с подключением к базе и подстановкой сгенерированных значений в SQL-запросы.
А я не нашёл ничего лучшего, чем соорудить простенькую функцию на Pl/PgSQL. Бонус - она исполняется на стороне сервера и может быть задействована в любом запросе или хранимой функции/процедуре без запуска дополнительных сущностей.
Выглядит так:
Возможно, кому-то пригодится.
P.S. Постояно замечаю, что люди используют СУБД преимущественно как место хранения таблиц, вынося всю логику в приложения. Причём, началось это не вчера (ругался на такой подход ещё в нулевые), но в последние годы тенденция приобрела угрожающие масштабы, вплоть до попыток теоретического обоснования "почему центральная БД с логикой - это плохо" со стороны микросервисников.
Джеффри Ульмана на них нет :)))
Понадобилось намедни нагенерить в постгресе некоторое количество неповторяющихся случайных mac-адресов с первым октетом из нулей.
Настоящий веб-программист :))) написал бы аж целый скрипт с подключением к базе и подстановкой сгенерированных значений в SQL-запросы.
А я не нашёл ничего лучшего, чем соорудить простенькую функцию на Pl/PgSQL. Бонус - она исполняется на стороне сервера и может быть задействована в любом запросе или хранимой функции/процедуре без запуска дополнительных сущностей.
Выглядит так:
-- random_mac() - generate random mac address with the first octet '00'
create or replace function random_mac()
returns text as $$
declare
line text;
bit text;
cnt integer;
begin
line = '00';
for cnt in 1..5 loop
bit = to_hex(floor(random()*255)::int);
if length(bit) = 1 then
bit = '0'||bit;
end if;
line = line || ':' || bit;
end loop;
return line;
end;
$$ language plpgsql;
-- Create table for urandom_mac() if not exists
create table if not exists random_mac_t (mac text primary key);
-- urandom_mac() - generate unique random mac address
create or replace function urandom_mac()
returns text as $$
declare
line text;
cnt integer;
begin
cnt = 1;
while cnt > 0 loop
line = random_mac();
select count(mac) from random_mac_t into cnt where mac = line;
end loop;
insert into random_mac_t (mac) values (line);
return line;
end;
$$ language plpgsql;
-- Usage:
insert into device_t (id, mac, ...) values (new_id(), urandom_mac(),...);
-- The end --Возможно, кому-то пригодится.
P.S. Постояно замечаю, что люди используют СУБД преимущественно как место хранения таблиц, вынося всю логику в приложения. Причём, началось это не вчера (ругался на такой подход ещё в нулевые), но в последние годы тенденция приобрела угрожающие масштабы, вплоть до попыток теоретического обоснования "почему центральная БД с логикой - это плохо" со стороны микросервисников.
Джеффри Ульмана на них нет :)))