Zapewne niejeden z was zauważył, po dodaniu nowego wiersza do tabeli (który ma powiedzmy nr 3), a następnie jego usunięciu wartość auto_increment nie cofa się, tak więc następny wiersz ma numer 4 i pozostaje luka w numeracji. Jest to działanie pożądane z punktu widzenia blogów czy portali internetowych, gdzie przypisanie nowego artykułu pod ostatnio usunięty mogłoby wprowadzić w błąd kogoś, kto dodał ów usunięty artykuł do ulubionych albo wysłał link koledze, który zobaczy zupełnie co innego niż powinien.

Niejednokrotnie jest to jednak działanie niepożądane – przykładem mogą być tu aplikacje działające po sieci LAN, gdzie wyżej wymieniona sytuacja z założenia nie będzie miała miejsca, zaś w których znaczenie ma ciągłość numeracji danych w tabeli.

Poniżej przedstawiono dwie funkcje. Jedna z nich zwraca lukę w numeracji tabeli jako int, przy czym jest to pierwsza napotkana luka. Kolejna z nich zwraca tablicę intów, czyli wszystkie luki w numeracji. Dzięki temu nowy wiersz można dodać w miejsce luki.

Poniższe przykłady szukają luki w kolumnie faktura_id tabeli faktura.


function luka()
{
	$query="SELECT faktura_id FROM faktura ORDER BY faktura_id";
	$result=mysql_query("$query") or die(mysql_error());
	while ($row=mysql_fetch_array($result))
	{
		$licz++;
		if ($row['faktura_id']!=$licz) return $licz;
	}
}



function luki()
{
	$query="SELECT faktura_id FROM faktura ORDER BY faktura_id";
	$result=mysql_query("$query") or die(mysql_error());
	$licz=0;
	while ($row=mysql_fetch_array($result))
	{
		$licz++;
		if ($row['faktura_id']!=$licz) 
		{
			$luki[]=$licz;
			$licz++;
		}
	}
	return $luki;
}
Dodano 27/12/2008 o 23:31
Kategoria: PHP, SQL
Tagi: , , , ,