GRY-Online.pl --> Archiwum Forum

Problem: MySQL

24.01.2005
19:18
[1]

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)

24.01.2005
19:21
[2]

Bzyk [ Offensive ]

Cainoor >> nie ma sensu tak robic. Po to masz autoincrementacje, aby nie martwic sie o id.

24.01.2005
19:23
[3]

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 ;)

24.01.2005
19:27
[4]

_Robo_ [ Generaďż˝ ]

Przeciez masz autoincrement? Czy to przyapdkiem samo nie dodawalo najwiekszego? Jak tak to po co recznie szukasz max(id)?

24.01.2005
19:29
[5]

fanlegii79 [ Konsul ]

a po co?

24.01.2005
19:29
[6]

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.

24.01.2005
19:32
[7]

_Robo_ [ Generaďż˝ ]

Powtorze czyjes pytanie ale po co? Na pewno to co chcesz zrobic robi sie uzywajac ID ? :)

24.01.2005
19:33
[8]

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.

24.01.2005
19:35
[9]

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....

24.01.2005
19:37
[10]

_Robo_ [ Generaďż˝ ]

Cainoor -> poczytaj o filozofii stosowania PK w tabelach i bedziesz widzial dlaczego "po co" :)

24.01.2005
19:38
[11]

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..

24.01.2005
19:41
[12]

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 .

24.01.2005
19:44
[13]

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 ...

24.01.2005
19:48
[14]

Cainoor [ Mów mi wuju ]

ok, to nie ma sensu.

Jednak ja nadel chce tak zrobić. Da się? :)

24.01.2005
19:52
[15]

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ć.

24.01.2005
19:58
[16]

Cainoor [ Mów mi wuju ]

Dzięki Belm.

24.01.2005
21:14
[17]

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!

© 2000-2024 GRY-OnLine S.A.