Я думаю, что это можно сделать ... Извините - это TSQL, но FWIW
Declare
@max int,
@min int,
@rand int
set @max = (select max(id) from myTable)
set @min = (select min(id) from myTable)
set @rand = Cast(((@max + 1) - @min) * Rand() + @min as int)
select * from myTable where id = @rand
Или, если у вас есть пробелы в полях первичного ключа, то:
select max(id) from myTable where id <= @rand
Возражение Пер @ Эндрю - он обеспокоен тем, что это будет способствовать меньшему количеству идентификаторов в несоответствующих конкурсах.Если это проблема, вы можете справиться несколькими способами:
Взять 2 записи за раз (мин и макс).Например:
INSERT INTO whatever_table_variable_etc
select max(id) from myTable where id <= @rand
UNION
select min(id) from myTable where id >= @rand
Или вы можете основывать его на коэффициентах и четностях.Например:
Declare @isOdd bool
SET @isOdd= CASE WHEN ABS(@rand) % 2 = 1 THEN 1 ELSE 0 END
If @isOdd = 1
select max(id) from myTable where id <= @rand
ELSE
select min(id) from myTable where id >= @rand