Когда вы говорите, что адреса хранятся как long
, я предполагаю, что вы имеете в виду, что они хранятся так, что (скажем) 10.1.2.3 будет храниться как 0x0a010203.В этом случае, чтобы найти, если адрес уже существует, вы можете выполнить:
SELECT ...
FROM ipranges
WHERE (<NEWADDR> >= startaddr)
AND (<NEWADDR> <= endaddr)
, а затем, если вы получите какие-либо строки назад, адрес уже находится в таблице.(конечно, замените <NEWADDR>
новым адресом!)
Что касается проверки перекрывающихся строк, то это немного сложнее:
SELECT ...
FROM ipranges
WHERE NOT ((<NEWENDADDR> < startaddr) OR (<NEWSTARTADDR> > endaddr))
, т. е. новый диапазон не перекрываетстарый диапазон при условии, что он либо начинается после него, либо заканчивается до него.