Cainoor [ Mów mi wuju ]
Problem: MySQL
Cześć. Jak w MySQL usuwając dany wiersz "przenumerować" wszystkie wartości w kolumnie ID, tak aby przy dodawaniu kolejnych rekordów nie pozostawiać tzw 'dziur'?
np. Mam wiersze od 1 do 10 i usuwam row nr 6. Teraz, gdy dodam coś do mojej tabeli, wiersz będzie miał wartość ID=11. Ja chcę, by albo przenumerować wiersze 7,8,9,10 na o jeden niższe, albo wstawiając nowy wiersz "przeszukiwać" wolne dziury i wstawiać w ich miesjce.
Możliwe, że jest o wiele lepszy/prostrzy sposób. Wszystkie komentarze mile widziane.
(kolumna id to primary key i ma ustawiony auto_increment)
Bzyk [ Offensive ]
Cainoor >> nie ma sensu tak robic. Po to masz autoincrementacje, aby nie martwic sie o id.
Cainoor [ Mów mi wuju ]
Bzyk ---> Wlasnie musze sie martwic, bo teraz usuwanie wiersza nie powoduje resetowania auto_increment i przy dodawaniu ustawia mi na wartość o jeden większa :/
Chyba, żeby w ogóle nie przejmować się id. tzn przy dodawaniu nic nie sprawdzać. O to chodzi ? Bo teraz mam tak, że przy insert sprawdzam jaki jest max(id) i dodaje o jeden większy. Pewnie to mi bruździ w tabeli ;)
_Robo_ [ Generaďż˝ ]
Przeciez masz autoincrement? Czy to przyapdkiem samo nie dodawalo najwiekszego? Jak tak to po co recznie szukasz max(id)?
fanlegii79 [ Konsul ]
a po co?
Cainoor [ Mów mi wuju ]
Chodzi o to, że gdy miałem 10 rekordów i usunałem jeden, to auto_increment był ustawiony na 11 i pod takim id dodaje mi rekord. Czyli mam teraz rekordów 10, ale źle poindeksowanych.
_Robo_ [ Generaďż˝ ]
Powtorze czyjes pytanie ale po co? Na pewno to co chcesz zrobic robi sie uzywajac ID ? :)
Cainoor [ Mów mi wuju ]
Ale co "po co"?
Mam ideksowanie. Usuwam wiersz. Dodaje wiersz. Indeksowanie jest złe.
Po to, aby indekoswanie było dobre.
TeadyBeeR [ Legend ]
A czy indeksowanie musi byc "dobre"? To tylko indeks i chyba nie ma znaczenia czy jest 1,2,3... czy 1,23,43,455....
_Robo_ [ Generaďż˝ ]
Cainoor -> poczytaj o filozofii stosowania PK w tabelach i bedziesz widzial dlaczego "po co" :)
wysiu [ ]
Kazda baza tak dziala. Po to sa indeksy na tabelach, zeby sie nie zmienialy przy kazdej zmianie ilosci rekordow:) Inaczej nie mialoby to najmniejszego sensu..
Belm [ Konsul ]
W nowym MySQL ą triggery. Możesz zdefiniować trigger "OnDelete" i przenumerować wiersze. Ale nie jestem pewny czy da redę przenumerować pole typu autoincrement .
mr_brain [ Pretorianin ]
w MySQL o to włąsnie chodzi zeby po usunienicu rekodru nic tam nie wskoczyło ... dzieki temu kazdy z wierszy do którego sie odwołujemy to zawsze ten któryc chcemy a nie o 2-3 nizszy... poczytaj troche o bazach danych o zrozumisz sens takiego poswtepowania ...
Cainoor [ Mów mi wuju ]
ok, to nie ma sensu.
Jednak ja nadel chce tak zrobić. Da się? :)
Belm [ Konsul ]
Cainoor -> Da się.
Ale zamiast autoincrement typ kolumny ustawiasz na zwykły numeryczny.
Definiujesz dwa triggery:
OnInsert - Trigger będzie definiował nową wartość kolumny ID, np. select max(id)+1 from tabela
OnDelete - Ten będzie przenumerowywał wiersze, i likwidował dziury w numeracji.
Będzie to działało potwornie wolno, ale teoretycznie da się to zrobić.
Cainoor [ Mów mi wuju ]
Dzięki Belm.
Bzyk [ Offensive ]
Cainoor >> wlasnie, juz Ci ktos odpowiedzial , ze da sie to zrobic, ale to wydajnosciowo zabije wieksza baze. Nie ma sensu. Lepiej naucz sie poprawnie myslec jesli chodzi o projekt bazy, bo - uwierz mi i bez urazy - nie mialbys tego problemu ktory masz ;) Powodzenia!